使用单独的单元而不是单独的数组

时间:2013-11-06 10:13:16

标签: ios uitableview

在Big Nerd Ranch书中: - iOS编程(第3版),Ch9第205页有一个青铜挑战。我们必须显示2个部分,1个显示项目>和其他项目< =
我知道如何使用两个独立的阵列解决这一挑战,一个存储昂贵的物品,另一个存储更便宜的物品。但我不想那样解决这个问题。我想要两种不同类型的单元格,其中type1指向昂贵的单元格,并在section0中进行调整。并且type2指向更便宜的并且被放置在section1中。 我试过这个但没有成功。这是代码: - 这个用于配置每个部分的行数:

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  {
      //#warning Incomplete method implementation.
      // Return the number of rows in the section.
      int numberOfRowsWithValueLessThanOrEqualToFifty=0, numberOfRowsWithValueMoreThanFifty=0;
       NSLog(@"No. of BNRItems- %d", [[[BNRItemStore sharedStore] allItems] count]);
       for (BNRItem *item in [[BNRItemStore sharedStore] allItems])
       {
            //BNRItem *p=[[[BNRItemStore sharedStore] allItems] objectAtIndex:i];
            if ([item valueInDollars]>50) 
            {
                 numberOfRowsWithValueMoreThanFifty++;
            }
            else
            {
                 numberOfRowsWithValueLessThanOrEqualToFifty++;
            }
       }

       if (section==0) {
            return numberOfRowsWithValueMoreThanFifty; //no. of rows in section0
       }
       else{
           return numberOfRowsWithValueLessThanOrEqualToFifty;//no. of rows in section1
       }

     }

这是用于配置两个单元格并根据具体情况返回其中一个单元格

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath  *)indexPath
   {
        NSLog(@"hello");

        static NSString *CellIdentifier = @"Cell";
        static NSString *CellIdentifier2 = @"Cell2";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        UITableViewCell *cell2 = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
        //Configure the cell...
        if (!cell) {
            cell= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
        if (!cell2) {
            cell2= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault           reuseIdentifier:CellIdentifier2];
        }

        BNRItem *p= [[[BNRItemStore sharedStore] allItems] objectAtIndex:indexPath.row];
        if([p value] >50)
        {
            [[cell textLabel] setText:[p description]];
        }
        else{
            [[cell2 textLabel] setText:[p description]];
        }

        if (indexPath.section==0) {
            return cell;
        }
        else{
            return cell2;
        } 
 }

现在代码有很多问题。如果第一个 if 子句与第二个 else 子句一起运行,那么选择第0节和第1节中的内容的所有目的都将被销毁。在上面的代码中,唯一有效的情况是当2 if 子句一起运行或2 else 子句一起运行时。但显然不会发生因为控制流程可能是随机的。那么这是否意味着人们无法使用两个不同类型的单元格来解决这个挑战2个不同的部分,但必须先创建单独的数组来存储廉价和昂贵的物品,然后将它们适当地推送到section0和section1? PLS。这样的建议是我解决这个问题的第一个想法,我真的希望这样做。

1 个答案:

答案 0 :(得分:0)

为什么不首先检查价格然后出列(或创建)相应的表格单元格? 像这样:

- (UITableViewCell*) tableView:(UITableView*) tableView cellForRowAtIndexPath:(NSIndexPath*) indexPath
{
NSLog(@"hello");
static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifier2 = @"Cell2";
UITableViewCell* cell = nil;
NRItem *p= [[[BNRItemStore sharedStore] allItems] objectAtIndex:indexPath.row];
if (indexPath.section==0)
{
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    [[cell textLabel] setText:[p description]];
}
else
{
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2];
    }
    [[cell textLabel] setText:[p description]];
}
return cell;
}