我有一个小的,固定大小的表,我想将UITableView完全加载到内存中,如果它们滚出视图,则永远不会重复使用单元格。我如何实现这一目标?
我没有使用UITableViewController;只是一个简单的UIViewController,它实现了正确的协议(UITableViewDataSource和UITableViewDelegate)。
答案 0 :(得分:19)
在行
中为重用标识符设置nil
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];
或者只需删除该行并添加,
UITableViewCell *cell = nil;
答案 1 :(得分:7)
只是不要实现方法UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SomeID"];
,并且不会重复使用任何单元格。每次它要求一个单元格时,你都会创建一个单元格并进行配置。
答案 2 :(得分:6)
如果您不想重复使用单元格,请务必在方法nil
中传递initWithStyle:reuseIdentifier:
,但要记住性能。只要它很好,你就可以通过nil
。
答案 3 :(得分:5)
前三个答案完全正确,您只需要确保不在dequeueReusableCellWithIdentifier
上调用UITableView
功能。除此之外,您只需在代码中分配单元格即可。首先,您需要一个实例变量来存储指向您单元格的指针(我假设您使用普通的视图控制器):
@interface MyViewController
@property (nonatomic, strong) NSArray* myTableViewCells;
@end
然后你可以通过覆盖它的getter来懒惰地实例化这个数组:
- (NSArray *)myTableViewCells
{
if (!_myTableViewCells)
{
_myTableViewCells = @[
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil],
[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]
];
}
return _myTableViewCells;
}
如果您愿意,可以将更多单元格添加到数组中,或使用NSMutableArray
。现在,您所要做的就是将此数组连接到正确的UITableViewDataSource
方法。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.myTableViewCells.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell* cell = self.myTableViewCells[indexPath.row];
//
// Add your own modifications
//
return cell;
}
这使得代码更清晰,更不容易出现内存泄漏(静态变量在程序结束时被释放,那么为什么我们将表视图单元保留在内存中,如果显示它们的视图控制器已经消失? )。
添加新单元格也更容易(无需切换或if语句),代码结构更加完善。
答案 4 :(得分:2)
EDITED
有时您需要一些单元格是静态的,例如,您需要第一个单元格下载具有下载进度条的单元格。等待下载单元格的其他单元格。在这种情况下,第一个单元格应该可以访问暂停和恢复功能(tableView:cellForRowAtIndexPath :)之外。
您可以尝试创建这样的静态单元格:
1st:子类UITableViewCell,用于创建自己的单元格(这是一个选项)
2nd:视图控制器中的crate静态单元格
static YourSubclassedTableViewCell *yourCell_0;
static YourSubclassedTableViewCell *yourCell_1;
static YourSubclassedTableViewCell *yourCell_2;
static YourSubclassedTableViewCell *yourCell_3;
3rd:viewDidLoad中的Init单元格(viewDidLoad是放置初始化代码的不错选择)
- (void)viewDidLoad
{
yourCell_0 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
yourCell_1 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
yourCell_2 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
yourCell_3 = [[YourSubclassedTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
// or simply
yourCell_0 = [[YourSubclassedTableViewCell alloc] init];
yourCell_1 = [[YourSubclassedTableViewCell alloc] init];
yourCell_2 = [[YourSubclassedTableViewCell alloc] init];
yourCell_3 = [[YourSubclassedTableViewCell alloc] init];
}
第4名:称重传感器
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.row) {
case 0:
yourCell_0.textLabel.text = @"1st Row";
return yourCell_0;
case 1:
yourCell_1.textLabel.text = @"2nd Row";
return yourCell_1;
case 2:
yourCell_2.textLabel.text = @"3rd Row";
return yourCell_2;
case 3:
yourCell_3.textLabel.text = @"4th Row";
return yourCell_3;
default:
defaultCell....(ignore)
return defaultCell;
}
}
**如上所述,单元格创建一次,可以在tableView:cellForRowAtIndexPath:
之外访问您还可以将单元格声明为@property,以使其可供其他类访问。
答案 5 :(得分:2)
只需分配一个新的单元格代替出列,无需执行上述任何操作。对于小型tableView(< 100 cell),性能影响可以忽略不计。
swift 3中的示例
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: .default, reuseIdentifier:"Cell")
return cell
}
干杯