如何根据条件创建UITableView单元格?

时间:2016-04-01 11:24:14

标签: ios objective-c uitableview

假设我的UITableView中有八个单元格,但我想只显示满足特定条件的单元格。我已完成this并已将numberOfRowsInSection实施为:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int i = 0;
for (A2OActivityCounter *ac in activityCounters) {
    if(ac.startDate != nil) {
        i++;
    }
}
if (i == 0) {
    return 1;
   }
return i;
}

因此,这将完全返回符合条件的单元格数量以及我想要在tableview中使用的单元格数量。我想知道如何在tableview中实现它。例如,八个单元格中有五个符合条件,因此返回的行数将为五。但我只希望显示这五个细胞,并且在这些细胞之间没有空白细胞。所以,如果细胞是这样的:

A - satisfies the condition B - satisfies the condition C - **does not** satisfies the condition D - satisfies the condition E - **does not** satisfies the condition F - satisfies the condition G - **does not** satisfies the condition H - satisfies the condition

你可能已经猜到我在桌子上只想要A,B,D,F和H,它们之间没有空单元格。如果不能在if (activityCounter.startDate != nil)中使用cellForRowAtIndexPath,因为如果条件不是true,我会返回什么,该方法要求我返回(UITableViewCell *) ,所以我可以;甚至返回nil。 有人可以帮我这个,谢谢!

3 个答案:

答案 0 :(得分:4)

你正在以错误的方式思考这个问题。您有一组数据activityCounters,以及要显示的数据的子集。因此,您应该有另一个实例变量,例如displayedActivityCounters,它是当前实际显示的已过滤内容列表。

现在,您的所有表格方法仅使用displayedActivityCounters

当您更改过滤条件时,您会从displayedActivityCounters生成新版activityCounters并重新加载该表。

答案 1 :(得分:1)

为什么不在方法中枚举activityCounters数组并重新加载UITableView?例如:

@property (nonatomic, strong) NSMutableArray *filteredActivityCounters;

- (void)setupContent {

self.filteredActivityCounters = [NSMutableArray array];

for (A2OActivityCounter *ac in activityCounters) {
    if(ac.startDate != nil) {
        [self.filteredActivityCounters addObject:ac];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
   return self.filteredActivityCounters.count;
}

然后你的cellForRowAtIndexPath:方法可以直接从这个过滤后的数组中拉出来:

A2OActivityCounter *ac = self.filteredActivityCounters[indexPath.row];

答案 2 :(得分:0)

您可以通过实现此tableview委托方法隐藏单元格,如下所示:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    CGFloat height = 44.0;//suupose your default hieght is 44.0

    if (indexPath.row== cell c's row || indexPath.row== cell E's row  || indexPath.row== cell G's row) {
        height = 0.0;
    }

    return height;
}