3

我在 UINavigationController 中使用带有 UITableView 的故事板。在这个 UITableView 中,使用了具有内部属性的自定义 tableViewCell。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    CustomTableViewCell *cell = nil;

    if (SYSTEM_VERSION_LESS_THAN(@"6.0") ) {

        //iOS 6.0 below
        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    }
    else {
        //iOS 6.0 above

        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; //work segue

    }

上面的代码适用于 push segue。但不是当我使用

     cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];   //not work segue

我使用这种分配方法来保存单元格的数据以防止重用单元格。

这只是 alloc 与 deque .. 方法的区别。我错过了什么?

编辑)我知道不使用 dequeReusableCell 方法对于性能原因是不利的。但是,细胞的数量不会很多。这就是我不需要 deque 方法的原因。

  1. “不工作”的意思是“不执行推送转场”,而不是崩溃。

    它显示的单元格与使用 dequeReusable 方法时相同,除了单元格右侧的公开指示图标。指示器图标来自故事板设置。

    当我触摸单元格时,单元格突出显示为蓝色,但没有执行推送。

  2. CustomTableViewCell 有 4 个属性。这与 UITableViewCell 完全不同。用户在 DetailViewController 设置属性(将 segue 推到此)。该单元格没有 IBOutlet 参考。在 MasterViewController(具有 tableView)中,cellForRowAtIndexPath 方法返回 CustomTableViewCell 上面的代码。

  3. cellForRowAtIndexPath 方法在 CustomTableViewCell 上的指示器左侧添加一个开/关按钮,并为单元格设置一个标签号。

4

1 回答 1

8

的使用dequeueReusableCellWithIdentifier使您能够使用原型单元。如果您使用initWithStyleinstead of dequeueReusableCellWithIdentifier,那么您不会,因此您也会丢失为这些单元格原型定义的任何 segue、披露指示符和其他 UI 外观。

如果你决定走这条路,你将不得不走“老派”(即做我们在单元原型之前都做过的事情)并编写自己的didSelectRowForIndexPath. 但是,如果您已经定义了该 segue,假设您将其称为“SelectRow”,那么您didSelectRowForIndexPath可以执行以下操作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    [self performSegueWithIdentifier:@"SelectRow" sender:cell];
}

如果您需要披露指示符,则您的自定义单元例程(或cellForRowAtIndexPath)必须手动设置。如果你添加它

cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

然后你需要手动处理它:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    [self performSegueWithIdentifier:@"SelectAccessory" sender:cell];
}

底线,你可以让它工作,但你只是做了很多额外的工作,失去了出列单元的性能和内存优势。我衷心鼓励您重新考虑不使用dequeueCellWithIdentifier.

于 2013-02-22T19:51:49.870 回答