使用不同的单元格类型创建分组的UITableview

时间:2012-06-25 20:21:08

标签: ios uitableview foursquare

我需要创建一个分组的uitableview,其中包含每个部分中的一些部分和可能不同的单元格类型。

我正在尝试创建类似旧的foursquare应用,用户页面(包括'排行榜','朋友建议','朋友','统计','最受探索的类别'......部分)。

我对ios编程相当新,因此该视图可能不是分组的uitableview。

我特别坚持的是为部分创建不同的单元格,并找出单击的单元格。

我的数据源将是2种不同的NSArray *,它由不同的数据类型组成,这就是我需要不同自定义单元格的原因。

2 个答案:

答案 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!
   }
}