模型法创建表视图
在以前的学习中,掌握的是对于做一个页面框架的开发方式无非是有以下几种:
(1)纯代码 + StoryBoard混合 开发 (故事板开发是苹果极力推崇的,因为创建比较简单,速度快)
(2)纯代码 (适用于公司团队合作的开发)
(3) 纯代码 + xib混合 (xib与故事板没有什么区别)
在今天看别人的博客的时候,知道纯代码创建页面框架还包括:纯代码 + 模型 思想 .
下面是参照学习的结果:以创建表视图为例
页面框架如下 :
代码实现如下 :
结构如下:
1 #import "SettingItem.h" 2 3 @implementation SettingItem 4 5 //类方法创建对象 6 + (instancetype)itemWithtitle:(NSString *)title{ 7 8 SettingItem *item = [[SettingItem alloc]init]; 9 item.title = title; 10 11 return item; 12 13 }
控制器继承UITableViewController:
1 #import "ViewController.h" 2 #import "GroupItem.h" 3 #import "SettingItem.h" 4 5 @interface ViewController () 6 7 8 //表视图的组数 9 @property (nonatomic,strong)NSMutableArray *groups; 10 11 @end 12 13 14 //"设置"页面 15 @implementation ViewController 16 17 - (void)viewDidLoad { 18 [super viewDidLoad]; 19 20 //添加第1组模型 21 [self setGroup1]; 22 //添加第2组模型 23 [self setGroup2]; 24 //添加第3组模型 25 [self setGroup3]; 26 27 28 29 } 30 31 32 //数据的懒加载 33 - (NSMutableArray *)groups{ 34 35 //不存在再创建 36 if (_groups == nil) { 37 38 _groups = [NSMutableArray array]; 39 40 } 41 return _groups; 42 43 } 44 45 46 //设置表视图的分组样式 47 - (instancetype)init{ 48 49 return [self initWithStyle:UITableViewStyleGrouped]; 50 } 51 52 53 - (void)setGroup1{ 54 // 创建组模型 55 GroupItem *group = [[GroupItem alloc]init]; 56 // 创建行模型 57 SettingItem *item = [SettingItem itemWithtitle:@"我的账号"]; 58 SettingItem *item1 = [SettingItem itemWithtitle:@"我的收藏"]; 59 60 // 保存行模型数组 61 group.items = @[item,item1]; 62 // 把组模型保存到groups数组 63 [self.groups addObject:group]; 64 } 65 66 - (void)setGroup2{ 67 68 GroupItem *group = [[GroupItem alloc]init]; 69 70 SettingItem *item = [SettingItem itemWithtitle:@"我去好评"]; 71 SettingItem *item1 = [SettingItem itemWithtitle:@"我去吐槽"]; 72 73 group.items = @[item,item1]; 74 75 [self.groups addObject:group]; 76 } 77 78 - (void)setGroup3{ 79 80 GroupItem *group = [[GroupItem alloc]init]; 81 82 SettingItem *item = [SettingItem itemWithtitle:@"关注我们"]; 83 SettingItem *item1 = [SettingItem itemWithtitle:@"关于我们"]; 84 85 group.items = @[item,item1]; 86 87 [self.groups addObject:group]; 88 } 89 90 91 #pragma mark - TableView的数据源代理方法实现 92 93 /** 94 * 返回有多少组的代理方法 95 */ 96 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 97 98 return self.groups.count; 99 } 100 /** 101 * 返回每组有多少行的代理方法 102 */ 103 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 104 105 GroupItem *group = self.groups[section]; 106 return group.items.count; 107 } 108 109 /** 110 * 返回每一行Cell的代理方法 111 */ 112 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 113 114 // 1 初始化Cell 115 // 1.1 设置Cell的重用标识 116 static NSString *ID = @"cell"; 117 // 1.2 去缓存池中取Cell 118 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 119 // 1.3 若取不到便创建一个带重用标识的Cell 120 if (cell == nil) { 121 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; 122 } 123 // 设置Cell右边的小箭头 124 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 125 126 // 2 设置数据 127 // 2.1 取出组模型 128 GroupItem *group = self.groups[indexPath.section]; 129 // 2.2 根据组模型取出行(Cell)模型 130 SettingItem *item = group.items[indexPath.row]; 131 // 2.3 根据行模型的数据赋值 132 cell.textLabel.text = item.title; 133 134 return cell; 135 }
我还是比较喜欢故事板和代码结合使用.毕竟对于项目来说,如果页面框架差不多,可以复用框架,复制代码即可.重用度更高!
UITableViewController的使用 :
创建UITableViewController不需要设置代理和方法,创建的时候,协议方法会自动写出来,不需要自己写.只需要简单设置即可.