禁用小型固定大小UITableView的单元重用

时间:2011-06-22 16:49:58

标签: iphone objective-c ios uitableview

我有一个小的,固定大小的表,我想将UITableView完全加载到内存中,如果它们滚出视图,则永远不会重复使用单元格。我如何实现这一目标?

我没有使用UITableViewController;只是一个简单的UIViewController,它实现了正确的协议(UITableViewDataSource和UITableViewDelegate)。

6 个答案:

答案 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
}

干杯