2012-02-04 109 views
3

在iOS5中,在故事板采用ARC和原型细胞的tableView,我可以代替下面的代码:dequeueReusableCellWithIdentifier是否适用于ARC?

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

提前致谢!

+0

是的,你可以。另外,它不需要ARC。只要您使用iOS 5和故事板,就可以使用新模式。 – 2012-02-04 17:31:02

+0

@JasonCoco:这应该是一个答案,而不是评论。 – 2012-02-04 17:33:04

+0

@JasonCoco我不明白为什么,但这件事对我来说不起作用。我不断收到一个“无”单元格。我创建了一个新的主 - 细节项目。这个例子很好用。当我添加cellForRowIndexPath方法和表大小方法并将大小设置为2时,我得到一个异常,因为dequeueReusableCellWithIdentifier一直让我“无”。 – ericyue 2012-02-04 17:43:20

回答

2

发生此问题是因为您未从故事板创建MenuViewController。你是这样创造的:

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

那的MenuViewController实例未连接到故事板,因此它不知道原型细胞中的故事板。

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

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

谢谢!它的工作原理:)有没有什么办法来创建MenuViewController从故事板直接? – ericyue 2012-02-05 03:03:00

+0

从“MenuButtonPressed:'方法中断开书签按钮(在时间轴导航栏中)。按住Control键从书签按钮拖动到故事板中的MenuViewController实例,然后选择Push或Modal作为segue类型。 – 2012-02-05 06:06:27

0

我的解决办法最终是这样的:

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

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

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

+1

不,这是低效率的,并且表明对细胞类如何与标识符关联的误解。如果出列方法没有返回'nil',那是因为您(a)已经将一个故事板单元原型与该标识符相关联; (b)你使用了'registerClass:forCellReuseIdentifier:';或者(c)你以前做过'initWithStyle:reusedIdentifier:',并且它已经成功地取出了单元格。现在,您通常会使用选项(a),并修改故事板,以使单元格原型具有适当的样式。然后你会消除你的第二行代码。 – Rob 2014-08-29 10:51:45

+0

谢谢Rob。我的代码是case(b),我找不到设置单元格样式的方法。 – 2014-08-30 08:41:52

+0

如果你使用了'registerClass',你的子类应该实现'initWithStyle',它调用'[super initWithStyle:...]',但明确指定适当的样式,而不是仅仅传递提供的'UITableViewCellStyle'。但是,上面的代码示例是不可取的,因为它会导致'initWithStyle'被调用两次(因为如果没有可用的单元可用于重用,则dequeueReusableCellWithIdentifier将自动调用initWithStyle)。 – Rob 2014-08-30 20:31:08