UI_tableView

本文详细介绍了如何使用Objective-C语言在iOS应用中实现表视图(UITableView)与单元格数据绑定,包括创建表视图控制器、初始化表视图、设置代理方法、实现数据展示逻辑及单元格的重用机制。通过实例演示,帮助开发者掌握表视图的基本用法和优化技巧。
摘要由CSDN通过智能技术生成

#import "AppDelegate.h"

#import "RootViewController.h"

#import "TwoViewController.h"

@interface AppDelegate ()


@end


@implementation AppDelegate



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

  

   // RootViewController *rootVC = [[RootViewController alloc]init];

    

   // UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:rootVC];

    

   // self.window.rootViewController = navC;

//-----------------------------------------------------------------------

    TwoViewController *twoVC = [[TwoViewController alloc]init];

    

    UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:twoVC];

    

    self.window.rootViewController = navC;

    

    

    

    

    

    

    

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    return YES;

}



#import "RootViewController.h"


@interface RootViewController ()<UITableViewDataSource,UITableViewDelegate> //它继承了scrollView的协议方法,可以直接使用。


@property(nonatomic,assign)int index;   //创建单元格的个数


@end


@implementation RootViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    self.navigationItem.title = @"表视图";

    self.navigationController.navigationBar.barTintColor = [UIColor redColor];

        //标示图的初始化

    UITableView *myTableView = [[UITableView alloc]initWithFrame:self.view.bounds  style:UITableViewStyleGrouped];//后面的style是让分区标题跟着移动

        //将表视图添加到当前视图上

    [self.view addSubview:myTableView];

    

        //表视图所有的操作都需要代理方法来协助完成。比较特殊的是,表视图的代理方法有两个,一个更偏重于外观的设置,一个偏重于数据的设置

    myTableView.delegate = self;    //偏重外观

    myTableView.dataSource = self;  //偏重属性

    

//tableView的属性

        //分割线的颜色

    myTableView.separatorColor = [UIColor cyanColor];

        //分割线的样式

    myTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;

        //统一设置单元格高度

    myTableView.rowHeight = 50;

    

    //设置选中效果(单元格的属性)

    

//给延展中的index赋值

    self.index = 0;

    

    

 //注册单元格

        //第一个参数为你所使用的单元格的类型

        //第二个参数是单元格的重用标示符

    [myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];

    

    

    

    

    

    

}


#pragma mark - 表视图的代理方法


//返回视图中分区的个数(此代理方法不是必须实现的,如果未实现此代理方法,默认只有一个分区,如果需要多个分区的时候,再实现此代理方法)

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    

    return 2;

}




//返回每个分区下的单元格的个数(必须实现的代理方法)

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{



    return 10;

}




//定制每个单元格(必须实现的代理方法)--记得每次创建的时候,使用重用机制!!!

    //indePath:当前所定制的单元格所在的位置。单元格的位置由两个属性确定:一个是单元格在哪个分区下(indexPath.section),一个是单元格在分区下的哪一行(indexPath.row)

//-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

//    /*

    //定义单元格

        //系统的单元格,会提供一些子控件

    UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

        //为相应位置返回定制好的单元格

    //判断当前单元格行的奇偶数

    if (indexPath.row %2 ==0) {

        cell.textLabel.text = [NSString stringWithFormat:@"我是第偶数个单元格,我在%ld分区下",indexPath.section];

    }else{

        cell.textLabel.text = [NSString stringWithFormat:@"我是第奇数个单元格,我在%ld分区下",indexPath.section];

    }

    return cell;

//    */




//    //cell的重用机制:

//    //1.每次要创建单元格的时候,先根据重用标示符从重用队列中获取单元格,如果未获得单元格,说明目前还没有单元格完全出屏幕。那么,我们就需要初始化单元格,如果可以获取那么就直接使用。

//    //2.每次表视图都会创建一屏幕的cell,当有cell出屏幕之后,就会根据重用标示符添加到对应的重用队列中,当屏幕外的cell要进入屏幕(要显示的时候),先从重用队列中获取cell,如果可以得到cell,那么就直接使用,如果cell不存在,那么就初始化cell

//    //3.当重用cell的时候,也就是从重用队列中取出的cell,系统不会帮我们将上面的子控件或者子控件上面所显示的内容清空,需要我们重新赋值。

//        //先定义重用标示符

//    static NSString *cellId = @"CELL";

//        //每次需要使用单元格的时候,需要重用队列中获取单元格,如果重用队列中没有单元格,再初始化新的单元格

//    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

//    

//        //如果从重用队列中未获取cell,也就是cell对象不存在,这时候我们就需要创建初始化单元格。

//    if (!cell) {//不存在的情况下

//        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellId];

//            //detailTextLabel,系统提供的这些控件都是需要配合不同样式来使用

//        cell.detailTextLabel.text = [NSString stringWithFormat:@"我是创建的%d个单元格",self.index++];


单元格的属性

//    //设置选中的样式

//        cell.selectionStyle = UITableViewCellSelectionStyleDefault;

//    //设置辅助视图样式

//        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

//    //设置左侧图片

//       cell.imageView.image = [UIImage imageNamed:@"Two30.png"];

//        

//    }

//    

//    cell.textLabel.text = [NSString stringWithFormat:@"我是第%ld个单元格",indexPath.row];

//    return cell;

//    

//}


//  注册单元格之后的写法,不用判断cell是否存在,不用初始化,直接使用

    //这种方式不能改变单元格的样式,只能使用默认的default

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];

    cell.textLabel.text = @"1111";

   //副标题视图,在这种写法中不能体现

    //cell.detailTextLabel.text = @"2222";

    return cell;

}






//添加分区标题(需要在之前有分区数量的代理)

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    

    return @"分区标题";

}


//设置对应位置的高度(单元格的行高)

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    //是偶数的cell的高度为150,奇数cell的高度为50

//    if (indexPath.row %2 == 0) {  //判断单元格行数

//        return 100;

//    }else{

//        return 50;

//    }

    if (indexPath.section == 0) {   //判断单元格的分区

        return 50;

    }else{

        return 200;

    }


}


//设置改变页眉的高度

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return 100;

}


//设置改变页脚的高度

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{

    return 50;

}




//索引条

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{


    return [NSArray arrayWithObjects:@"A", @"B",nil];


}


//点击cell之后执行的代理方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"我点击了%ld分区下%ld行的单元格",indexPath.section,indexPath.row);

}


@end










#import "TwoViewController.h"


@interface TwoViewController ()<UITableViewDelegate,UITableViewDataSource>

    //承载所有联系人的数组,每个联系人都是一个字典

@property(nonatomic,retain)NSMutableArray *allPersonMutableArr;

    //带分区的最大容器

@property(nonatomic,retain)NSMutableDictionary *allPersonMutableDic;


@end


@implementation TwoViewController

    //懒加载

-(NSMutableArray *)allPersonMutableArr{

    if (!_allPersonMutableArr) {

        _allPersonMutableArr = [NSMutableArray new];

    }

    return _allPersonMutableArr;

}


-(NSMutableDictionary *)allPersonMutableDic{

    if (!_allPersonMutableDic) {

        _allPersonMutableDic = [NSMutableDictionary new];

    }

    return _allPersonMutableDic;

}







//通讯录形式

    //[数组(字典),@“A”,数组(字典),@“B”]

        //联系人的数据存在一个可变字典中,每个联系人都有一个字典,将这个字典存储在一个可变数组中,然后给数组设置对应的值,放在最大的字典中,每个数组就是一个分区,通过键值对应来响应通讯录找人的功能

    //带分区的假数据

-(void)createDataSection{

    NSDictionary *person_1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"HanOBa",@"name",@"100",@"age",@"",@"sex",nil];

    NSDictionary *person_2 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Hello",@"name",@"99",@"age",@"",@"sex",nil];

    NSDictionary *person_3 = [[NSDictionary alloc]initWithObjectsAndKeys:@"World",@"name",@"98",@"age",@"",@"sex",nil];

    NSDictionary *person_4 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Forever",@"name",@"97",@"age",@"",@"sex",nil];

    NSDictionary *person_5 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Love",@"name",@"96",@"age",@"",@"sex",nil];

    NSDictionary *person_6 = [[NSDictionary alloc]initWithObjectsAndKeys:@"",@"name",@"21",@"age",@"",@"sex",nil];

    NSDictionary *person_7 = [[NSDictionary alloc]initWithObjectsAndKeys:@"",@"name",@"18",@"age",@"",@"sex",nil];

    NSDictionary *person_8 = [[NSDictionary alloc]initWithObjectsAndKeys:@"嘻嘻",@"name",@"60",@"age",@"",@"sex",nil];

    NSDictionary *person_9 = [[NSDictionary alloc]initWithObjectsAndKeys:@"哈哈",@"name",@"60",@"age",@"",@"sex",nil];

    NSDictionary *person_10 = [[NSDictionary alloc]initWithObjectsAndKeys:@"马勒戈壁卧槽",@"name",@"500",@"age",@"煞笔",@"sex",nil];

    

    //创建第一个分区下的所有的联系人

    NSArray *oneSectionArray = [NSArray arrayWithObjects:person_1,person_2,person_3,person_4,person_5, nil];

    //创建第二个分区下所有的联系人

    NSArray *twoSectionArray = [NSArray arrayWithObjects:person_6,person_7,person_8,person_9,person_10, nil];

    //将分区加载到可变字典中

    [self.allPersonMutableDic setObject:oneSectionArray forKey:@"A"];

    [self.allPersonMutableDic setObject:twoSectionArray forKey:@"B"];

}





    //制造假数据,来测试使用

-(void)creatData{

    NSDictionary *person_1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"HanOBa",@"name",@"100",@"age",@"",@"sex",nil];

     NSDictionary *person_2 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Hello",@"name",@"99",@"age",@"",@"sex",nil];

     NSDictionary *person_3 = [[NSDictionary alloc]initWithObjectsAndKeys:@"World",@"name",@"98",@"age",@"",@"sex",nil];

     NSDictionary *person_4 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Forever",@"name",@"97",@"age",@"",@"sex",nil];

     NSDictionary *person_5 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Love",@"name",@"96",@"age",@"",@"sex",nil];

     NSDictionary *person_6 = [[NSDictionary alloc]initWithObjectsAndKeys:@"",@"name",@"21",@"age",@"",@"sex",nil];

     NSDictionary *person_7 = [[NSDictionary alloc]initWithObjectsAndKeys:@"",@"name",@"18",@"age",@"",@"sex",nil];

     NSDictionary *person_8 = [[NSDictionary alloc]initWithObjectsAndKeys:@"嘻嘻",@"name",@"60",@"age",@"",@"sex",nil];

     NSDictionary *person_9 = [[NSDictionary alloc]initWithObjectsAndKeys:@"哈哈",@"name",@"60",@"age",@"",@"sex",nil];

     NSDictionary *person_10 = [[NSDictionary alloc]initWithObjectsAndKeys:@"马勒戈壁卧槽",@"name",@"500",@"age",@"煞笔",@"sex",nil];

    

    //将所有人的信息添加到可变数组中

     [self.allPersonMutableArr addObject:person_1];

     [self.allPersonMutableArr addObject:person_2];

     [self.allPersonMutableArr addObject:person_3];

     [self.allPersonMutableArr addObject:person_4];

     [self.allPersonMutableArr addObject:person_5];

     [self.allPersonMutableArr addObject:person_6];

     [self.allPersonMutableArr addObject:person_7];

     [self.allPersonMutableArr addObject:person_8];

     [self.allPersonMutableArr addObject:person_9];

     [self.allPersonMutableArr addObject:person_10];


}




- (void)viewDidLoad {

    [super viewDidLoad];

  

        //创建数据

    //不带分区的数据

    //[self creatData];

    //带分区的数据

    [self createDataSection];

    

    self.navigationItem.title = @"练习";

    self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];

//初始化一个和屏幕宽高一样的表视图

    UITableView *myTableView = [[UITableView alloc]initWithFrame:self.view.bounds];

    

//设置代理方法

    myTableView.delegate = self;

    myTableView.dataSource = self;


//tableView添加到父视图上

    [self.view addSubview:myTableView];

    

//注册单元格(可选)(配合创造单元格第一个方法写)

//    [myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];

    

    

    

    

}

#pragma mark - 表视图的代理方法

    //创造多少个分区的代理方法:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    //返回所有联系人的分区(联系人存在一个可变字典中)

    return self.allPersonMutableDic.count;

}

#warning 两个必须实现的代理!!!

//实现必须实现的代理方法:

   //每个分区下单元格的个数的代理方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

//    //返回每个分区下联系人的个数(这个是没有分组的假数据)

//    return self.allPersonMutableArr.count;

    

    //根据当前所在的分区,将字典中对应的小数组取出

    NSArray *smallArray = [self.allPersonMutableDic.allValues objectAtIndex:section];

    NSLog(@"数组%@",self.allPersonMutableDic.allValues);

    return smallArray.count;

}


//    //定义单元格代理方法:

//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

//    UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];

//    

//    //先从大数组中将对应位置的联系人信息取出

//    NSDictionary *personInfoDic = [self.allPersonMutableArr objectAtIndex:indexPath.row];

//    //从联系人信息中将姓名取出

//    NSString *nameStr = [personInfoDic objectForKey:@"name"];

//    

//    myCell.textLabel.text = nameStr;

//    return myCell;

//}

//


    //定义单元格-(不使用注册的方式,老写法)(等同于上面注释的写法)

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{


    //创建重用标示符

    static NSString *reUsedId = @"CELL";

    //根据标示符从重用队列中取出cell

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reUsedId];

    //判断cell是否存在

    if (!cell) {

        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reUsedId];

    }

    

    //以下是第一次无规律的:

//    //赋值-(只能写在if判断之外,并且在if判断之后)

//        //取出单个联系人的信息

//    NSDictionary *personInfoDic = [self.allPersonMutableArr objectAtIndex:indexPath.row];

//    //取出联系人的姓名、年龄、性别

//    NSString *nameStr = [personInfoDic objectForKey:@"name"];

//    NSString *ageStr = [personInfoDic objectForKey:@"age"];

//    NSString *sexStr = [personInfoDic objectForKey:@"sex"];

//    //显示姓名

//    cell.textLabel.text = nameStr;

//    //显示年龄和性别

//    cell.detailTextLabel.text = [NSString stringWithFormat:@"年龄:%@ 性别:%@",ageStr,sexStr];

//

    

    //以下是第二次:

    //第一步先从字典中取出响应的小数组

    NSArray *infoArray = [self.allPersonMutableDic.allValues objectAtIndex:indexPath.section];

    //第二步从小数组中取出对应位置的联系人信息

    NSDictionary *personInfoDic = [infoArray objectAtIndex:indexPath.row];

    

    NSString *nameStr = [personInfoDic objectForKey:@"name"];

    NSString *sexStr = [personInfoDic objectForKey:@"sex"];

    NSString *ageStr = [personInfoDic objectForKey:@"age"];

    

    cell.textLabel.text = [NSString stringWithFormat:@"姓名:%@ 年龄:%@ 性别:%@",nameStr, ageStr,sexStr];;

   

    cell.detailTextLabel.text = [NSString stringWithFormat:@"年龄:%@ 性别:%@",ageStr,sexStr];

    

    

    

    return cell;

}


//为每个分区添加标题

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    

    

    return [self.allPersonMutableDic.allKeys objectAtIndex:section];


}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值