为什么我们使用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行,我会明白这一点,但我不确定这里......
由于
答案 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:
并未支付有意义的性能或可读性,所以为什么要担心呢?