segue不使用UITableViewCell alloc,但是dequeueReusableCellWithIdentifier

bur*_*nut 3 uitableview ios segue

我在UINavigationController中使用了带UITableView的storyboard.在这个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

    }
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于push segue.但不是我用的时候

     cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];   //not work segue
Run Code Online (Sandbox Code Playgroud)

我使用这种alloc方法来保留细胞重复使用细胞的数据.

它只是alloc vs deque ..方法的区别.我错过了什么?

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

  1. "不工作"意味着"不要执行push segue",而不是崩溃.

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

    当我触摸单元格时,单元格突出显示为蓝色,但不执行push segue.

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

  3. cellForRowAtIndexPath方法在CustomTableViewCell的指示符左侧添加开/关按钮并设置单元格的标记号.

Rob*_*Rob 8

使用dequeueReusableCellWithIdentifier是使您能够使用原型单元的原因.如果您使用initWithStyle而不是dequeueReusableCellWithIdentifier,那么您没有,因此您丢失了任何segues,披露指标,以及您为这些单元原型定义的其他UI外观.

如果你决定走这条路,你将不得不去"老学校"(即做我们以前在细胞原型之前做过的事情)并自己编写didSelectRowForIndexPath.但是如果你已经定义了segue,那么假设你称它为"SelectRow",那么你didSelectRowForIndexPath可以执行:

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

    [self performSegueWithIdentifier:@"SelectRow" sender:cell];
}
Run Code Online (Sandbox Code Playgroud)

如果您需要公开指标,那么您的自定义单元例程(或cellForRowAtIndexPath)必须手动设置.如果你添加它

cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
Run Code Online (Sandbox Code Playgroud)

然后你需要手动处理它:

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

    [self performSegueWithIdentifier:@"SelectAccessory" sender:cell];
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,你可以让它发挥作用,但你只是做了很多额外的工作,并且失去了退出单元格的性能和内存优势.我衷心鼓励你重新考虑不使用的决定dequeueCellWithIdentifier.