【问题标题】:Does dequeueReusableCellWithIdentifier work with ARC?dequeueReusableCellWithIdentifier 是否适用于 ARC?
【发布时间】:2012-02-26 21:46:15
【问题描述】:

在 iOS5 中,使用 ARC 和原型单元格用于 storyboard 上的 tableView,我可以替换下面的代码吗:

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView 
  dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] 
      initWithStyle:UITableViewCellStyleDefault 
      reuseIdentifier:CellIdentifier];
}

// Configure the cell...
return cell;

用这个简单的代码?:

UITableViewCell *cell = [tableView 
  dequeueReusableCellWithIdentifier:@"Cell"];
return cell;

我在这个链接上看到了这个:

http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1

提前致谢!

【问题讨论】:

  • 是的,你可以。此外,它不需要ARC。只要您使用的是 iOS 5 和故事板,就可以使用新模式。
  • @JasonCoco:这应该是一个答案,而不是评论。
  • @JasonCoco 我不明白为什么,但这东西对我不起作用。我不断得到一个“零”单元格。我创建了一个新的主从项目。该示例效果很好。当我添加 cellForRowIndexPath 方法和表大小方法并将大小设置为 2 时,我得到一个异常,因为 dequeueReusableCellWithIdentifier 一直让我“nil”。
  • @Moonlight 在你的故事板中,你需要确保你创建了一个原型单元,并且你在 IB 中给它的标识符和你在代码中所做的一样(在你的例子中,Cell)。它区分大小写,因此必须将其命名为 Cell,并带有大写字母“C”,并且您的故事板中应该只有一个具有该名称的原型单元格。
  • @JasonCoco 是的,我想我做了所有这些事情,但我仍然返回零单元格。这是一个演示代码ericyue.info/Circle.zip

标签: iphone objective-c ios5 automatic-ref-counting uistoryboard


【解决方案1】:

出现此问题是因为您没有从情节提要创建MenuViewController。您正在这样创建它:

MenuViewController *menuViewController = [[MenuViewController alloc] init];

MenuViewController 的实例没有连接到情节提要,因此它不知道情节提要中的原型单元。

你需要进入你的故事板并将MenuViewController 的标识符设置为menuViewController 之类的东西。然后你可以像这样创建一个实例:

MenuViewController *menuViewController =  [self.storyboard instantiateViewControllerWithIdentifier:@"menuViewController"];

【讨论】:

  • 谢谢!它有效:) 有没有办法直接从情节提要创建 MenuViewController?
  • 断开书签按钮(在时间轴导航栏中)与MenuButtonPressed: 方法的连接。按住 Control 从书签按钮拖动到情节提要中的 MenuViewController 实例,然后选择 PushModal 作为 segue 类型。
【解决方案2】:

我的解决方案最终是这样的:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier
                                                          forIndexPath:indexPath];

cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];

因为从 iOS 5.0 开始,第一行代码永远不会产生 nil 值,而且我没有看到其他方法来指定我想要的样式。或者,我可以从库中添加一个 Table View Controller 实例,然后我可以在原型单元格中编辑样式。

【讨论】:

  • 不,这是低效的,并且表明对单元格类与标识符的关联方式存在误解。如果 dequeue 方法没有返回 nil,那是因为您 (a) 已将情节提要单元原型与该标识符相关联; (b) 您使用了registerClass:forCellReuseIdentifier:;或者 (c) 你之前做过initWithStyle:reusedIdentifier: 并且它成功地使单元格出队。现在,您通常会使用选项(a),并修改情节提要,使单元原型具有适当的样式。然后你会删除你的第二行代码。
  • 谢谢罗伯。我的代码是 case (b),我找不到设置单元格样式的方法。
  • 如果你使用了registerClass,你的子类应该实现initWithStyle,它调用[super initWithStyle:...],但是明确指定适当的样式,而不是仅仅传递提供的UITableViewCellStyle。但是上面的代码示例是不可取的,因为它会导致 initWithStyle 被调用两次(因为如果没有单元格可供重用,dequeueReusableCellWithIdentifier 将调用 initWithStyle 本身,但你会再次调用它)。
猜你喜欢
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多