创建具有不同单元格类型的分组 UITableview
Posted
技术标签:
【中文标题】创建具有不同单元格类型的分组 UITableview【英文标题】:Creating Grouped UITableview with Different Cell Types 【发布时间】:2012-06-25 20:21:07 【问题描述】:我需要创建一个分组的 uitableview,其中包括一些部分,并且每个部分中可能包含不同的单元格类型。
我正在尝试创建类似旧的foursquare 应用程序、用户页面(包括“排行榜”、“朋友建议”、“朋友”、“统计”、“最常探索的类别”......部分)。
我对 ios 编程相当陌生,因此该视图可能不是分组的 uitableview。
我特别坚持的是为部分创建不同的单元格,并找出点击了哪些单元格。
我的数据源将是 2 个不同的 NSArray*,它们由不同的数据类型组成,这就是为什么我需要不同的自定义单元格。
【问题讨论】:
【参考方案1】:由于您有两组不同的数据,并且需要在不同的部分中显示,因此您必须将数据源方法一分为二。
基本上,选择您想首先成为的数据集然后就可以了。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if(section)return secondArray.count;
//Essentially, if statements evaluate TRUE and move forward if the inside is 1 or greater (TRUE == 1)
return firstArray.count;
//If the first if statement return hits, then the code will never reach this statement which turns this into a lighter if else statement
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if(indexPath.section)
//do stuff with second array and choose cell type x
else
//do stuff with first array and choose cell type y
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
//Get the cell with: UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
if(indexPath.section)
//perform action for second dataset
else
//perform action for first dataset
对于标题,您可以使用这些方法中的任何一种,并保持与上述相同的样式类型:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
【讨论】:
欢迎询问我。 我认为您应该澄清 if 语句中的 indexPath.section 和 section 应该与 0 和 1 进行比较。哦,让“if(section)return secondArray.count; return firstArray.count;
”if(section = 0)return firstArray.count elsereturn secondArray.count
感谢@RileyE。除了为每个部分设置标题外,现在已经很清楚了。如果您知道,您能否在您的答案中也添加该信息?
感谢@ipwnstuff,帮助我理解部分/计数的事情。
这样效果更好吗?我试图解释,而不是改变。【参考方案2】:
您可以创建多个 UITableViewCell 的自定义子类,并且在您的 UITableViewDataSource 的 tableView:cellForRowAtIndexPath: 方法中,您可以使用 if 语句来确定要使用的单元格类型。
例如,以下是我可能会做的粗略概述:
-(UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//First, determine what type of object we're showing
if (indexPath.section == 0)
//Create and return this cell.
else if (indexPath.section == 1)
//Create and return this cell.
...
下面是你如何实现numberOfRowsInSection
:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
if (section == 0)
return [firstSectionArray count];
else if (section == 1)
return [secondSectionArray count];
...
对于didSelectRowAtIndexPath
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (indexPath.section == 0)
ObjectSelected *objectSelected = [firstArray objectAtIndex:indexPath.row];
//Now you've got the object, so push a view controller:
DetailViewController *dvc = [[DetailViewController alloc] init];
dvc.objectSelected = objectSelected;
[self.navigationController pushViewController:dvc];
else if (indexPath.section == 1)
//Same thing, just call [secondArray objectAtIndex:indexPath.row] instead!
【讨论】:
感谢您的回答。好的,这是有道理的,但是我怎样才能在这个方法中获取项目,我有 2 个不同的数组但是这个方法只给出索引?以及如何通过您的方法实现 numberOfRowsInSection 和 didSelectRowAtIndexPath 方法? 我认为你的问题没有说得很清楚。你到底想做什么,这个答案有什么问题?这正是创建不同类型的单元格所需要做的。 @RileyE 是的,我想你是对的。正如我在评论中所说,这可能会解决放置不同类型的单元格的问题,但我仍然不知道如何理解单击了哪个单元格,以及如何将数据传递给其单击操作。我希望现在清楚了吗? 是的。那更好。您将在 didSelectRow 方法中获得 indexPath,然后您只需执行与之前对数组所做的相同类型的检查,以确定它是什么类型。 非常感谢@RileyE。最后一个问题,如果这不是太多。如何使用 2 个不同的 NSArray 设置 TableView 的数据源?以上是关于创建具有不同单元格类型的分组 UITableview的主要内容,如果未能解决你的问题,请参考以下文章
如何在 UITableView 样式分组中设置单元格的角半径?