2011-10-23 45 views
11

想要创建静态菜单(IOS 5)并尝试在故事板内创建自定义单元格,然后加载到分组的tableview中。在Storyboard内创建自定义UITableViewCell

我已创建的视图控制器类设置到适当的TableViewController出口

@property(nonatomic,strong) IBOutlet UITableViewCell *labelCell; 

,我已经连接了自定义单元格到此插座。

我也有代表和数据源设置。

我有

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return self.labelCell; 
} 

我敢肯定有一吨的错,但我只是想显示一个单元,并从那里走。似乎没有任何通过故事板在IB内执行自定义单元格的示例。我仍然可以使用旧的方式创建一个xib文件并将其加载到mainBundle中,但我只想保持最新的我猜。

但与我上面我得到一个崩溃时,我加载此视图控制器。 SIGABRT

回答

13

如果您已将UITableView设置为在故事板中使用“静态单元格”,则不需要实施任何UITableViewDataSource方法,并且可以直接在Interface Builder中修改单元格。对于单个标签单元格,请选择单元格并将其类型更改为“基本”。现在您可以像处理其他视图对象一样编辑单元格。

+1

没错。就是这样。不知道为什么我没有找到任何告诉你这样做的指南。使它更容易。 – Doug

+1

作为一个随机问题,使用静态单元是否意味着您具有您在IB中指定的单元格的数量?既然你不必实现数据源方法,我想你不能改变你的表视图中的数据,这就是为什么他们称之为静态的 - 对吗? – Warkst

+0

@Warkst - 确切地说。实际上,您应该删除数据源方法的存根实现。 – jrturton

27

以下是我在使用故事板时如何为桌子获取单元格的知识。将UITableView拖到视图中时,它会附带一个已被设置为子视图的原型单元。要使用此原型单元格,请在属性检查器中设置唯一的重用标识符,然后使用相同的标识符使cellForRowAtIndexPath:方法中的单元格出列。如果出队调用返回nil,则省略从头创建单元的代码;我不认为这会发生。所以只要将这个单元格出队,用通常的UITableViewCell方法对其进行配置,然后返回它。

但您也可以创建UITableViewCell的自定义子类。只需在故事板的类别标识检查器中设置类名称,然后将所需的任何元素从“对象”调板拖放到单元格中即可。然后在你的子类的代码文件中为它们创建IBOutlet属性,并以通常的方式将它们连接到故事板中的单元格。这比在代码中完成这一切要好得多!

最后,您可以在表格中拥有多种单元格。只需将UITableViewCell对象从选用板拖放到表中,并在属性检查器中为每个对象提供唯一的重用标识符。在你的cellForRowAtIndexPath:方法中,选择每个单元格的类型,并且你可以有一个非常灵活的表格视图。

+1

这完全是真的,但问题是关于静态表视图,它不使用原型。 – jrturton

+0

我有一个新的场景(怀疑)。如果我有一个带有'+','''按钮和'UITextField'的自定义单元格的'UITableView'。所有的设置都是根据你的第2段完成的,但是现在如果我想阻止我的单元格被重用,是否有任何好的方法呢?我应该这样做吗? (我想添加多个电子邮件ID的功能) – thesummersign

+0

@jrturton啊,但有些从谷歌搜索到达这里,没有意识到“静态”部分。标题有点误导。所以*这个*答案实际上是我*寻找的东西。 –

4

This教程对我很有帮助。你可以通过标签来引用你需要的任何对象。

在故事板拖动一个UIImageViewUILabel等,并设置(任何你想要的)标签100,然后在你的- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath使用标签来引用它。

下面是本教程中的示例代码,只记得设置标签的故事板:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

// Configure the cell... 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

// Display recipe in the table cell 
Recipe *recipe = [recipes objectAtIndex:indexPath.row]; 
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100]; 
recipeImageView.image = [UIImage imageNamed:recipe.imageFile]; 

UILabel *recipeNameLabel = (UILabel *)[cell viewWithTag:101]; 
recipeNameLabel.text = recipe.name; 

UILabel *recipeDetailLabel = (UILabel *)[cell viewWithTag:102]; 
recipeDetailLabel.text = recipe.detail; 

return cell; 
}