在Storyboard中创建自定义的UITableViewCell

11

想要创建一个静态菜单(IOS 5),并尝试在Storyboard中创建自定义单元格,然后加载到分组的表视图上。

我已经创建了出口。

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

ViewController类被设置为正确的TableViewController,我已经将自定义单元格连接到这个输出口。

我也设置了代理和数据源。

我已经有了

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

我确定这段代码有很多问题,但我只是想显示一个单元格并从那里开始。似乎没有任何关于在故事板中通过IB创建自定义单元格的示例。我仍然可以使用旧的方法创建一个xib文件并将其加载到主捆绑包中,但我想保持最新状态。

但是,使用我上面的代码,当我载入这个视图控制器时,会崩溃并显示SIGABRT。

3个回答

27

当使用故事板时,关于如何获取表格单元格的内容,我学到了以下几点。将UITableView拖入你的视图中时,它会默认设置一个原型单元格作为子视图。为了使用这个原型单元格,在属性检查器中设置一个唯一的重用标识符,然后在cellForRowAtIndexPath:方法中使用相同的标识符来出列单元格。如果dequeue调用返回nil,我会省略从头开始创建单元格的代码;我认为这种情况不可能发生。所以只需出列单元格,用通常的UITableViewCell方法进行配置,然后返回它。

但是,你也可以创建自定义的UITableViewCell子类。只需在故事板的类身份检查器中设置类名,并从对象面板中将任何想要的元素拖到单元格中即可。然后在子类的代码文件中创建IBOutlet属性,并以通常的方式将它们连接到故事板中的单元格。这比全部在代码中完成要好得多!

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


1
这一切都是真的,但问题是关于静态表视图,它们不使用原型。 - jrturton
我有一个新的场景(疑问)。如果我有一个包含“+”、“-”按钮和UITextField的自定义单元格的UITableView。所有设置都已根据您的第2段完成,但现在如果我想防止重用我的单元格,有没有好的方法可以做到这一点?我应该这样做吗?(我希望能够添加多个电子邮件ID的功能) - geekay
@jrturton 啊,但有些人是通过谷歌搜索到这里的,没有意识到“静态”部分。标题有点误导。所以这个答案实际上是我在寻找的。 - Greg M. Krsak

13
如果您在Storyboard中将UITableView设置为使用“静态单元格”,则无需实现任何UITableViewDataSource方法,您可以直接在Interface Builder中修改单元格。对于一个只有一个标签的单元格,选择该单元格并将其类型更改为“基本”。现在,您可以像编辑任何其他视图对象一样编辑该单元格。

1
没错,就是这样。不确定为什么我没有找到任何指南告诉你要做这件事。这使得操作变得更加容易。 - Doug
1
作为一个随机问题,使用静态单元格是否意味着您在IB中确切地拥有指定数量的单元格?由于您不必实现数据源方法,我想您无法更改表视图中的数据,这就是为什么它被称为静态的原因 - 对吗? - RDM
@Warkst - 没错。实际上,你应该删除数据源方法的存根实现。 - jrturton

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

在Storyboard上拖放一个UIImageViewUILabel等组件,并将标签设置为100(任何你想要的值),然后在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法中使用该标签进行引用。

以下是教程中的示例代码,只需记得在Storyboard中设置标签:

 - (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;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接