关于iOS的tableView的cellForRowAtIndexPath
说明:
1. 如果是标准的cell,比如每个cell上的元素是一样的,那么可以直接利用缓存;
2.如果是非标准的cell,每个cell展示的元素会有差别,那么对这些有差别的视图组件要进行特殊处理。
2.1 特殊处理:
2.1.1 在缓存中获取到这些特殊的视图组件,必须将其从contentView中移除;
2.1.2 每次重新创建这些特殊视图组件(也就是说这些特殊元素是不能用缓存,否则会在界面上下滚动时候会发生错乱)。
3.添加到cell的contentView的子视图,必须为子视图定义唯一的tag属性,在获取缓存的时候可以通过tag属性进行相应的操作处理。
4. 在cell上进行操作后,例如改变了cell上显示的内容,必须去修改tableView对应的数据源,否则在滚动时发现已经修改掉的内容却还是显示出来。
#pragma mark - 绘制单元格 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //-------定义界面展示需要的视图组件------------------ //时间和联赛 UILabel* timeAndClubName; //主队和客队 UIImageView* ivTeam1Icon; UIImageView* ivTeam2Icon; UILabel* lblTeam1Name; UILabel* lblTeam2Name; //关注按钮 UIButton* btnAttention; //比分 UILabel* lblScore; //直播频道 UILabel* lblChannel; //定义缓存标记 static NSString *identifier = @"cell_id"; UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; //-------创建界面展示需要的视图组件------------------ //时间和联赛 timeAndClubName = [[UILabel alloc]initWithFrame:CGRectMake(0, 20, cell.width, 10)]; [timeAndClubName setFont:[UIFont systemFontOfSize:11]]; timeAndClubName.textAlignment = NSTextAlignmentCenter; timeAndClubName.textColor = [UIColor lightGrayColor]; timeAndClubName.tag=TAG_START_INDEX+1; //主队和客队 ivTeam1Icon = [[UIImageView alloc] initWithFrame:CGRectMake(40, 20, 40, 40)]; ivTeam1Icon.tag=TAG_START_INDEX+2; ivTeam2Icon = [[UIImageView alloc] initWithFrame:CGRectMake(cell.width-80, 20, 40, 40)]; ivTeam2Icon.tag=TAG_START_INDEX+3; lblTeam1Name = [[UILabel alloc]initWithFrame:CGRectMake(0, ivTeam1Icon.bottom +5, 120, 20)]; lblTeam1Name.tag=TAG_START_INDEX+4; lblTeam1Name.textAlignment = NSTextAlignmentCenter; [lblTeam1Name setFont:[UIFont systemFontOfSize:12]]; lblTeam2Name = [[UILabel alloc]initWithFrame:CGRectMake(cell.width-120, ivTeam2Icon.bottom+5 , 120, 20)]; lblTeam2Name.tag=TAG_START_INDEX+5; lblTeam2Name.textAlignment = NSTextAlignmentCenter; [lblTeam2Name setFont:[UIFont systemFontOfSize:12]]; //直播频道 lblChannel = [[UILabel alloc]initWithFrame:CGRectMake(0, timeAndClubName.bottom +50, 120, 20)]; lblChannel.center = CGPointMake(cell.center.x, lblChannel.frame.origin.y); lblChannel.textAlignment = NSTextAlignmentCenter; [lblChannel setFont:[UIFont systemFontOfSize:11]]; lblChannel.textColor = [UIColor lightGrayColor]; lblChannel.tag=TAG_START_INDEX+8; }else{ //-------从缓存中获取界面展示需要的视图组件------------------ //时间和联赛 timeAndClubName = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+1]; //主队和客队 ivTeam1Icon = (UIImageView*)[cell.contentView viewWithTag:TAG_START_INDEX+2]; ivTeam2Icon = (UIImageView*)[cell.contentView viewWithTag:TAG_START_INDEX+3]; lblTeam1Name = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+4]; lblTeam2Name = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+5]; //关注按钮 UIView* view1 = [cell.contentView viewWithTag:TAG_START_INDEX+6]; if (view1) { [view1 removeFromSuperview]; } //比分 UIView* view2 = [cell.contentView viewWithTag:TAG_START_INDEX+7]; if (view2) { [view2 removeFromSuperview]; } //直播频道 lblChannel = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+8]; } //----------关注按钮、比分 比较特殊(有些cell显示,有些不显示),因此每次需要重新创建 start---------------- //关注按钮 btnAttention = [UIButton buttonWithType:UIButtonTypeCustom]; btnAttention.frame = CGRectMake((cell.width-25)/2, timeAndClubName.bottom +11, 25, 25); [btnAttention addTarget:self action:@selector(btnAttentionClick:) forControlEvents:UIControlEventTouchUpInside]; btnAttention.tag=TAG_START_INDEX+6; //比分 lblScore = [[UILabel alloc]initWithFrame:CGRectMake(0, timeAndClubName.bottom +30, 120, 20)]; lblScore.center = CGPointMake(cell.center.x, lblScore.frame.origin.y); lblScore.textAlignment = NSTextAlignmentCenter; [lblScore setFont:[UIFont systemFontOfSize:18]]; lblScore.tag=TAG_START_INDEX+7; //----------关注按钮、比分 比较特殊(有些cell显示,有些不显示),因此每次需要重新创建 end---------------- //设置cell被选中的效果 cell.selectionStyle = UITableViewCellSelectionStyleNone; //获取cell显示的数据源 NSDictionary *option = [_dicData objectForKey:[_categoryArray objectAtIndex:indexPath.section]][indexPath.row]; // UIView* mainView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.width, cell.height)]; //时间和联赛 timeAndClubName.text=[NSString stringWithFormat:@"%@ %@",[[option objectForKey:@"time"] substringWithRange:NSMakeRange(11,5)],[option objectForKey:@"name"]]; //主队和客队 UIImage* placeHoldImage = [UIImage imageNamed:KGQ_DEFAULT_FOR_TEAM]; [MyHttpRequest downloadImage:[[option objectForKey:@"team1"] objectForKey:@"icon"] andWithImageShower:ivTeam1Icon andWithPlaceHoldIMage:placeHoldImage andBlock:^(UIImage *image) {}]; [MyHttpRequest downloadImage:[[option objectForKey:@"team2"] objectForKey:@"icon"] andWithImageShower:ivTeam2Icon andWithPlaceHoldIMage:placeHoldImage andBlock:^(UIImage *image) {}]; // [ivTeam2Icon sd_setImageWithURL:[[option objectForKey:@"team2"] objectForKey:@"icon"] placeholderImage:[UIImage imageNamed:KGQ_DEFAULT_FOR_TEAM]]; lblTeam1Name.text=[[option objectForKey:@"team1"] objectForKey:@"name"]; lblTeam2Name.text=[[option objectForKey:@"team2"] objectForKey:@"name"]; //关注按钮 BOOL isAttention = [[option objectForKey:@"attention_state"] isEqualToString:@"0"] ? NO : YES; if (isAttention) { [btnAttention setImage:[UIImage imageNamed:KGQ_IMAGE_ATTENTION_YES] forState:UIControlStateNormal]; }else{ [btnAttention setImage:[UIImage imageNamed:KGQ_IMAGE_ATTENTION_NO] forState:UIControlStateNormal]; } //比分 lblScore.center = CGPointMake(cell.center.x, lblScore.frame.origin.y); lblScore.text=[NSString stringWithFormat:@"%@:%@",[[option objectForKey:@"team1"] objectForKey:@"score"],[[option objectForKey:@"team2"] objectForKey:@"score"]]; /* “state”:”比赛状态(0=未开始,1=进行中,2=已结束)” */ NSString* strState = [option objectForKey:@"state"]; NSInteger state = [strState intValue]; //直播频道 lblChannel.text=[option objectForKey:@"channel"]; if (state==2) {//比赛结束 lblChannel.text=@"已完场"; } //加入contentView if (state==0) { [cell.contentView addSubview:btnAttention]; }else{ [cell.contentView addSubview:lblScore]; } [cell.contentView addSubview:ivTeam1Icon]; [cell.contentView addSubview:ivTeam2Icon]; [cell.contentView addSubview:timeAndClubName]; [cell.contentView addSubview:lblTeam1Name]; [cell.contentView addSubview:lblTeam2Name]; [cell.contentView addSubview:lblChannel]; return cell; }
相关推荐
这个名为“iOS tableview_demo_mvc”的项目,显然是一份使用Model-View-Controller(MVC)设计模式编写的TableView示例代码,旨在帮助新手理解并实践iOS中的 MVC 模式。下面将详细介绍 MVC 模式以及在 iOS 开发中...
- `tableView:cellForRowAtIndexPath:`:为指定索引路径的行返回一个UITableViewCell实例。 2. 委托方法: - `tableView:didSelectRowAtIndexPath:`:当用户选择一行时调用。 - `tableView:...
这些方法包括`numberOfSectionsInTableView:`,`tableView:numberOfRowsInSection:`,`tableView:cellForRowAtIndexPath:`等。 - 注意,内嵌TableView的大小和位置需要根据需求进行精确设置,可以通过AutoLayout...
这个“iOS TableView demo”提供了一系列关于TableView的实例代码,帮助开发者了解和掌握如何在iOS应用中有效地使用TableView进行数据展示和交互。 首先,`TableViewAuto`可能是指自动布局和尺寸调整的功能。在iOS...
单元格的样式可以通过重写`- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath`方法来定制。 在实现展开和关闭功能时,我们通常需要维护一个数据模型,该...
在`tableView:cellForRowAtIndexPath:`方法中,我们将解析好的数据赋值给UITableViewCell的各个元素,如label、imageView等。 此外,为了给用户一个良好的加载体验,我们还可以添加一个菊花加载指示器...
这个入门示例将带你逐步了解如何在iOS应用中使用TableView,展示基础的数据,并进行更高级的定制。 首先,让我们了解一下UITableView的基本概念: 1. **UITableView**:它是苹果提供的一个类,用于创建和管理包含...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView ...
这个“ios-TableView delegate dataSource封装.zip”文件显然提供了一个关于如何封装这两个协议的方法,以便在多个UITableView实例中重用代码,避免了每次创建新的表格视图时都需要手动复制和粘贴相同的数据源和代理...
3. **数据源方法**:实现UITableViewDataSource协议的方法,如`numberOfSectionsInTableView:`、`tableView:numberOfRowsInSection:`和`tableView:cellForRowAtIndexPath:`。在`cellForRowAtIndexPath:`中,通过`...
在`tableView:cellForRowAtIndexPath:`方法中,根据indexPath获取或复用cell,并填充数据。 3. 代理(Delegate):UITableView的委托遵循UITableViewDelegate协议,处理用户与表格的交互,如点击事件、编辑操作等。...
这个"ios tableview"的实例源代码,名为"SWTableViewSelectionDemo-master",很显然是一个关于UITableView选择功能的演示项目。下面我们将深入探讨UITableView及其选择功能的相关知识点。 首先,UITableView是一个...
iOS tableView实现单选和...通过上面的代码,我们可以实现iOS tableView的单选和多选功能,包括记录当前选中的行,实现tableView的点击事件,并在tableView的cellForRowAtIndexPath方法中判断当前行是否为选中的行。
这个“iOS Tableview”的主题主要涉及到如何在iOS应用中创建和使用UITableView来构建类似列表的用户界面。 首先,我们来理解UITableView的基本结构。UITableView由两部分组成:cells(单元格)和sections(分区)。...
这个名为“ios-通过tableView添加行数.zip”的资源包显然与动态添加UITableView行数有关。在iOS应用中,当你点击某一行时,通常会触发一个事件,该事件允许你在用户界面上更新数据并反映出这些变化。这里我们将详细...
总的来说,这个项目提供了关于如何在iOS应用中动态管理UITableView cell数量的实例,这对于任何涉及数据展示的iOS开发者来说都是重要的技能。理解并掌握这部分知识,将有助于构建更加交互性和响应性的用户界面。
在实际编码过程中,你可能会在`- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath`方法中创建和配置cell,然后在`- (void)tableView:(UITableView *)...
3. `tableView:cellForRowAtIndexPath:`:为指定索引路径创建并返回一个`UITableViewCell`。在这个方法中,你可以根据Plist数据填充单元格的内容。 对于`UITableViewDelegate`,你可以实现以下方法来处理用户交互:...
这个"iOS tableView"主题,结合"新手入门"和"使用demo"的描述,显然是为了帮助初学者理解和掌握如何在iOS应用中创建和操作UITableView。 UITableView是一个视图控件,它的主要功能是显示一行行的数据,每行可以包含...
4. 实现`tableView:cellForRowAtIndexPath:`方法,为每一行创建并配置UITableViewCell。 5. 可能还包含了对`tableView:didSelectRowAtIndexPath:`的实现,以便在用户点击单元格时响应。 此外,为了展示数据,开发者...