实例讲解iOS应用开发中使用UITableView创建自定义表格

一、带索引目录的表视图

1.效果图

2.数据源

本想获取通讯录中得名字,但为了用模拟器调试方便,就写死了数据,所以也只写了部分字母,总之有那么点意思就成

代码如下:

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    NSArray *sectionTitles; // 每个分区的标题
    NSArray *contentsArray; // 每行的内容
}

/** @brief 准备数据源 在viewDidLoad方法中调用*/
- (void)readySource
{
    
    sectionTitles       = [[NSArray alloc] initWithObjects:
                           @"A",@"C",@"F",@"G",@"H",@"M",@"S",@"T",@"X",@"Z", nil];
    contentsArray       = [[NSArray alloc] initWithObjects:
                            @[@"阿伟",@"阿姨",@"阿三"],
                            @[@"蔡芯",@"成龙",@"陈鑫",@"陈丹",@"成名"],
                            @[@"芳仔",@"房祖名",@"方大同",@"芳芳",@"范伟"],
                            @[@"郭靖",@"郭美美",@"过儿",@"过山车"],
                            @[@"何仙姑",@"和珅",@"郝歌",@"好人"],
                            @[@"妈妈",@"毛主席"],
                            @[@"孙中山",@"沈冰",@"婶婶"],
                            @[@"涛涛",@"淘宝",@"套娃"],
                            @[@"小二",@"夏紫薇",@"许巍",@"许晴"],
                            @[@"周恩来",@"周杰伦",@"张柏芝",@"张大仙"],nil];
}

3.显示索引

代码如下:

// 每个分区的页眉
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [sectionTitles objectAtIndex:section];
}
// 索引目录
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
    return sectionTitles;
}
        ④点击索引,跳转到点击的分区

// 点击目录
-(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    // 获取所点目录对应的indexPath值
    NSIndexPath *selectIndexPath = [NSIndexPath indexPathForRow:0 inSection:index];
    
    // 让table滚动到对应的indexPath位置
    [tableView scrollToRowAtIndexPath:selectIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    
    return index;
}

二、可以进行行标记的表视图

1.效果图

2.在cellForRow方法中,将Cell的accessoryType设置为None

代码如下:

// 定义其辅助样式
       cell.accessoryType      = UITableViewCellAccessoryNone;

3.在didSelectRow方法中

代码如下:

// 点击行事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 获取点击行的cell
    UITableViewCell *cell   = [tableView cellForRowAtIndexPath:indexPath];
    
    // 如果cell已经被标记
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        // 取消标记
        cell.accessoryType  = UITableViewCellAccessoryNone;
    }
    
    // 如果cell未标记
    else{
        // 标记cell
        cell.accessoryType  = UITableViewCellAccessoryCheckmark;
    }
    // 取消选中效果
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

此时,点击行即可选中,取消选中,但是滚动一下视图吧,你会发现下面某些未被点击的行也已经被标记了,这是因为cell的重用机制造成的,在第一篇文章中就这个问题有提到过

4.解决cell重用问题,在cellForRow方法中,定义cellIdetifier时,将其每一行都定义为不同的值,就不会出现覆盖,重复等现象了,但是这个方法太过粗暴,并不是最好的解决办法,情急之下可以先用,然后再慢慢调试Table上的数据

代码如下:

NSString *cellIdentifier = [NSString stringWithFormat:@"cellIdentifier%d%d",indexPath.row,indexPath.section];

三、定制表视图的每一行内容

1.我们做一个类似网易新闻客户端的新闻列表的table,如下图左;简易效果图,如下图右

2.数据源,在interface中声明

代码如下:

NSMutableArray *news_MArray;// 新闻内容数据源
    新建一个model类,命名为"newsModel",存放每一项数据

newsModel.h如下,.m中没有添加其他代码,如果需要拷贝,可以重载copyWithZone方法,
#import <Foundation/Foundation.h>
 
typedef NS_ENUM(NSInteger, NEWSReportType){
    NEWSReportOrdinary, // 普通新闻
    NEWSReportExclusive,// 独家新闻
    NEWSReportSpecial,  // 专题新闻
};
 
@interface newsModel : NSObject
 
@property (nonatomic, copy)NSString *       news_image;     //图片
@property (nonatomic, copy)NSString *       news_title;     //标题
@property (nonatomic, copy)NSString *       news_summary;   //摘要
@property (nonatomic, assign)NSInteger      news_replyNo;   //跟帖数量
@property (nonatomic, assign)NEWSReportType reportType;     //报道类型
 
 
@end

在viewDidLoad方法中

代码如下:

news_MArray = [[NSMutableArray alloc] init];
for(NSInteger index =0; index<10; index++){
    newsModel *model    = [[newsModel alloc] init];
    model.news_image    = [NSString stringWithFormat:@"%d.jpg",index+1];
    model.news_title    = @"曾在月光之下望烟花";
    model.news_summary  = @"曾共看夕阳渐降下 我怎么舍得去放下 要怎么舍得去放下";
    model.news_replyNo  = index+196;
    model.reportType    = index%3;
    
    [news_MArray addObject:model];
}

3.行数

代码如下:

// 每个分区行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [news_MArray count];
}

4.自定义cell上控件

在cellForRow方法中if(cell==nil)前

代码如下:

/*****自定义cell******/
newsModel *model    = [news_MArray objectAtIndex:indexPath.row];
 
UIImageView *   image_view;     //1.添加imageView
UILabel *       title_label;    //2.添加标题Label
UILabel *       summary_label;  //3.添加摘要Label
UILabel *       replyNo_label;  //4.添加跟帖数量Label
UIButton  *     extra_view;     //5.属于专题或者独家报道,进行标记
/********************/

在if(cell==nil)内

代码如下:

/*****自定义cell******/
        
        //1.添加imageView
        CGRect imageViewF   = CGRectMake(5, 5, 85, 65);
        image_view          = [[UIImageView alloc] initWithFrame:imageViewF];
        [cell addSubview:image_view];
        
        //2.添加标题Label
        CGRect titleLabelF  = CGRectMake(95, 5, 230, 24);
        title_label         = [[UILabel alloc] initWithFrame:titleLabelF];
        title_label.font    = [UIFont systemFontOfSize:16];//字体大小
        [cell addSubview:title_label];
        
        //3.添加摘要Label
        CGRect summaryLabelF  = CGRectMake(97, 27, 210, 40);
        summary_label         = [[UILabel alloc] initWithFrame:summaryLabelF];
        summary_label.font    = [UIFont systemFontOfSize:12];    // 字体大小
        summary_label.textColor     = [UIColor darkGrayColor];  // 文字颜色
        summary_label.numberOfLines = 2;
        [cell addSubview:summary_label];
        
        //4.跟帖数量Label
        CGRect replyNoLabelF  = CGRectMake(210, 45, 95, 24);
        replyNo_label         = [[UILabel alloc] initWithFrame:replyNoLabelF];
        replyNo_label.font    = [UIFont systemFontOfSize:12];    // 字体大小
        replyNo_label.textColor     = [UIColor darkGrayColor];  // 文字颜色
        replyNo_label.textAlignment = NSTextAlignmentRight;      // 文字右对齐
        
        //5.专题extraView
        CGRect extraViewF       = CGRectMake(270, 50, 28, 14);
        extra_view              = [[UIButton alloc] initWithFrame:extraViewF];
        extra_view.titleLabel.font = [UIFont boldSystemFontOfSize:10];
        [extra_view setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        
        // 普通新闻,只添加跟帖数量
        if (model.reportType==NEWSReportOrdinary) {
           [cell addSubview:replyNo_label];
        }
        // 专题新闻,添加专题标志,并添加跟帖数量
        else if(model.reportType == NEWSReportSpecial){
            
            // 设置背景色
            extra_view.backgroundColor = [UIColor colorWithRed:120.0/255.0 green:170.0/255.0 blue:245.0/255.0 alpha:1.0];
            
            [extra_view setTitle:@"独家" forState:UIControlStateNormal];// 设置标题
            
            [cell addSubview:extra_view];                               // 添加
            
            replyNo_label.frame = CGRectMake(170, 45, 95, 24);          // 改变跟帖数量Label的坐标
            
            [cell addSubview:replyNo_label];                            // 添加跟帖数量Label
        }
        // 独家新闻,只添加独家标志
        else if(model.reportType == NEWSReportExclusive){
            
            extra_view.backgroundColor = [UIColor redColor];            // 设置背景颜色
            
            [extra_view setTitle:@"专题" forState:UIControlStateNormal]; // 设置标题
            
            [cell addSubview:extra_view];                               // 添加到cell
        }
/********************/

在if(cell==nil)后

代码如下:

/*****自定义cell******/
    [image_view setImage:[UIImage imageNamed:model.news_image]];// 设置图片
    title_label.text    = model.news_title;                     // 设置标题
    summary_label.text  = model.news_summary;                   // 设置小标题
    replyNo_label.text  = [NSString stringWithFormat:@"%d 跟帖",model.news_replyNo];// 设置跟帖数量
/********************/

5.设置行高

代码如下:

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 75;
}

(0)

相关推荐

  • iOS自动生成表格效果的实现代码

    一.效果图 二.工程图 三.代码. RootViewController.h #import <UIKit/UIKit.h> #import "LabelOnBackImage.h" @interface RootViewController : UIViewController { LabelOnBackImage *labelFirst; } @end RootViewController.m #import "RootViewController.h&quo

  • iOS中创建表格类视图WBDataGridView的实例代码

    项目中创建表格, 引用头文件 #import "WBDataGridView.h" - (void)viewDidLoad{ [superviewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColorwhiteColor]; CGFloat margin = 10.f; CGFloat width = self.view.frame.size.wi

  • 实例讲解iOS应用开发中使用UITableView创建自定义表格

    一.带索引目录的表视图 1.效果图 2.数据源 本想获取通讯录中得名字,但为了用模拟器调试方便,就写死了数据,所以也只写了部分字母,总之有那么点意思就成 复制代码 代码如下: @interface ViewController ()<UITableViewDataSource,UITableViewDelegate> {     NSArray *sectionTitles; // 每个分区的标题     NSArray *contentsArray; // 每行的内容 } /** @brie

  • 实例讲解iOS应用开发中UIPickerView滚动选择栏的用法

    基础 1.UIPickerView 属性 数据源(用来告诉UIPickerView有多少列多少行) 复制代码 代码如下: @property(nonatomic,assign) id dataSource; 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择) 复制代码 代码如下: @property(nonatomic,assign) id   delegate; 是否要显示选中的指示器 复制代码 代码如下: @property(nonatom

  • iOS程序开发中设置UITableView的全屏分隔线的方法(不画线)

    ableView是app开发中常用到的控件,功能很强大,多用于数据的显示.下面给大家介绍设置UITableView的全屏分隔线的两种方法. 具体详情如下所示: 如图 添加如下代码 sTableView.separatorInset = UIEdgeInsetsZero; sTableView.layoutMargins = UIEdgeInsetsZero; cell.layoutMargins = UIEdgeInsetsZero; 第二种方法如下图 -(void)viewDidLayoutS

  • 实例讲解Android app开发中ListView的基本使用及优化

    一.直接使用ListView组件创建 1.直接在XML中创建ListView用entries属性附上一个数组资源 其中divider属性是设置分割线可以使用颜色和drawable资源分割 <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider=&

  • 举例讲解iOS应用开发中hitTest触摸事件的编写方法

     hitTest:withEvet  调用过程 比如如果是当前的View A, 还有一个viewB 如果不重写 hitTest 方法,那么 系统默认是先调用viewA的hitest 方法,然后再调用viewB的htest方法. 系统的调用过程,跟下面的重写hitest的方法是一模一样的. 复制代码 代码如下: -(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event  {      if ([self pointInside:poin

  • 以代码实例总结iOS应用开发中数据的存储方式

    ios数据存储包括以下几种存储机制: 属性列表 对象归档 SQLite3 CoreData AppSettings 普通文件存储 1.属性列表 复制代码 代码如下: //  //  Persistence1ViewController.h  //  Persistence1  //  //  Created by liu lavy on 11-10-3.  //  Copyright 2011 __MyCompanyName__. All rights reserved.  //    #imp

  • 举例讲解iOS应用开发中对设计模式中的策略模式的使用

    策略模式是一种常见的软件设计模式,这里简单得介绍一下策略模式并用IOS简单实现一下. 所谓的策略模式,顾名思义是要采用不同的策略的.一般来说,在不同的情况下,处理某一个问题的方法也不一样.比如说对字符串的排序和对数字的排序,虽然用的都是快排,但是显然不可能使用一段通用的代码.有人说java里面的compareTo可以做到,但如果考虑这么一个问题:同样是出门旅行,老年人身体虚弱,需要大量的休息,而孩子则是精力充沛,希望玩到更多的景点.如何在同一模式下表达以上信息.采用合理的设计模式进行封装而不是大

  • 实例讲解Android应用开发中TabHost的使用要点

    Tab与TabHost: 这就是Tab,而盛放Tab的容器就是TabHost . 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了.一个Activity,对应了多个功能布局. 新建一个Tab项目,注意,不要生成main Activity . 注意IDE,这里不要选... 在包里面新建一个类MyTab,继承于TabActivity. 其实,TabActivity是Activity的子类 package zyf.tab.test; import android.app.TabActivi

  • 实例讲解Android应用开发中Fragment生命周期的控制

    一.Fragment的生命周期初探 因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的. 如果Activity是暂停状态,其中所有的Fragment都是暂停状态:如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动:如果Activity被销毁,那么它其中的所有Fragment都会被销毁. 但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除F

  • 简单讲解iOS应用开发中的MD5加密的相关使用

    一.简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题. 如:可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请求数据 "青花瓷"软件 因此:提交用户的隐私数据时,一定不要明文提交,要加密处理后再提交 2.常见的加密算法 MD5 \ SHA \ DES \ 3DES \ RC2和RC4 \ RSA \ IDEA \ DSA \ AES 3.加密算法的选择 一般公司都会有一套自己的加密方案,按照公司

随机推荐