dequeueReusableCell ...为2行?

时间:2011-09-16 20:29:05

标签: objective-c uitableview

为什么我们使用dequeueReusableCellWithIdentifier,如果单元格和部分完全填充屏幕的大小,或者甚至小于屏幕的高度:假设我们有2个部分,每个部分只有1行?

示例:

    switch (indexPath.section)
{
    case kMonitoringSection:
    {
        cell = [tableView dequeueReusableCellWithIdentifier:kMonitoringCellIdentifier];
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kMonitoringCellIdentifier] autorelease];
            cell.textLabel.text = NSLocalizedString(@"Monitoring", @"");

            UISwitch *switchCtl = [[[UISwitch alloc] initWithFrame:CGRectMake(197, 8, 94, 27)] autorelease];
            [switchCtl addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];
            switchCtl.backgroundColor = [UIColor clearColor];

            [cell.contentView addSubview:switchCtl];
        }

        break;
    }

    case kLevelSection:
    {
        cell = [tableView dequeueReusableCellWithIdentifier:kLevelCellIdentifier];
        UILabel *levelLabel = nil;
        if (cell == nil)
        {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kLevelCellIdentifier] autorelease];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            cell.textLabel.text = NSLocalizedString(@"Level", @"");

            levelLabel = [[[UILabel alloc] initWithFrame:CGRectMake(171, 11, 120, 21)] autorelease];
            levelLabel.tag = kLevelTag;
            levelLabel.textAlignment = UITextAlignmentRight;
            [cell.contentView addSubview:levelLabel];
            levelLabel.backgroundColor = [UIColor clearColor];
        }
示例代码中的

:BatteryStatus

如果我们有20行,我会明白这一点,但我不确定这里......

由于

3 个答案:

答案 0 :(得分:2)

如果你只有一个静态的单元格数,比如你的tableView中只有两个(不同的)单元格,并且没有重复单元格,你应该在你的XIB中实现你的两个单元格(并设计它们)第一个用UISwitch,另一个用自定义UILabel 并指向IBOutlet

更简单,更少的代码,并且在不需要重用单元格时完全有意义。

请阅读Apple's Table View Programming Guide 这是一个非常好的资源(就像Apple文档中的每一个编程指南一样)并详细解释了所有这些。特别是The Technique for Static Row Content部分解释了这个确切的用例。


当然,在这种情况下你可以使用dequeueReusableCellWithIdentifier,它不会受到伤害(可能在BatteryStatus样本中他们这样做了,因为他们不知道它是否真的有用与否,只是作为一种习惯,因为他们在有更多行的时候一直这样做,但这不是最好的方法。

请注意,Apple提供的示例代码并不总是 要遵循的解决方案:它们只是一种方式来执行sthg,尤其是示例通常倾向于关注它想要测试的功能(在这种情况下是电池状态)并且不担心其他任何事情(特别是性能 - 除非样本当然是关于性能的。)

答案 1 :(得分:1)

如果你不想,你不必打电话。它不是必需的方法或类似的东西。模板为您提供了它,许多示例使用它,因为它就在那里,如果您使表更大,则不必添加任何方法。

如果您认为自己不需要,请不要打电话。

答案 2 :(得分:1)

每次调用tableView:cellForRowAtIndexPath:时,从头开始实例化一个新单元格是不必要的浪费,所以我认为你想要将你的两个单元格保留在某个地方。

你可以以任何你想要的方式做到这一点,但是,任何一般的单元缓存解决方案看起来都很像dequeueReusableCellWithIdentifier:,如果需求发生变化,任何不太通用的解决方案都可能会妨碍你。您在示例中使用dequeueReusableCellWithIdentifier:并未支付有意义的性能或可读性,所以为什么要担心呢?