我需要创建一个分组的uitableview,其中包含每个部分中的一些部分和可能不同的单元格类型。
我正在尝试创建类似旧的foursquare应用,用户页面(包括'排行榜','朋友建议','朋友','统计','最受探索的类别'......部分)。
我对ios编程相当新,因此该视图可能不是分组的uitableview。
我特别坚持的是为部分创建不同的单元格,并找出单击的单元格。
我的数据源将是2种不同的NSArray *,它由不同的数据类型组成,这就是我需要不同自定义单元格的原因。
答案 0 :(得分:6)
由于您有两组不同的数据,并且需要在不同的部分中显示这些数据,因此必须将数据源方法拆分为两个。
基本上,选择您想要的数据集,然后选择离开。
- (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;
答案 1 :(得分:5)
您可以创建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!
}
}