2

我有一个代表 a 的实体Person和一个UITableViewCell显示所述人的一些属性的子类。

问题是:您通常在哪里配置(设置文本、图片等)表格单元格?你:

A)在UITableViewController实现时在子类中配置它tableView:cellForRowAtIndexPath:

B) 将 Person 对象传入UITableViewCell子类,让子类自行配置?

C) 完全不同的东西?

奖励积分

如果你用选项 A 回答,那么这个呢?

假设对于表格视图的第一行,我需要将所有标签的文本加粗。这会改变你的看法吗?你看我在这里得到了什么,如果你在视图控制器中配置单元格,视图控制器将变得臃肿,包含它并不真正需要的信息。但是,如果将所有配置都放在表格单元子类中,则会失去一些可重用性。这绝对是一种权衡,但我想知道大多数工程师会选择什么。

4

4 回答 4

3

转到您的界面生成器并选择单元格。使用检查器,将您的单元格与您的自定义链接UITableViewCell

督察

之后,在tableView:cellForRowAtIndexPath:而不是实例化您的单元格UITableViewCell,配置它并瞧瞧。

然后,回答您的评论:

将单元格项目链接到自定义单元格标题中的属性。 链接单元格

假设我UILabel cellTitle在此示例中创建了属性,因此当我在 处实例化单元格时tableView:cellForRowAtIndexPath:,我只需设置此属性的文本。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"pedidosCell"; //the same at the nib!
    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    cell.cellTitle.text = @"This is my cell title";
    // Using your Person object, that should be available here.
    cell.cellTitle.text = [Person name];

    return cell;
}

至于粗体,您应该坚持使用选项 A。在 a 中加载数据是一项不常见的任务,UITableViewCell因为它应该非常快地处理滚动。将数据放入其中不会像 Apple 预期的那样工作。

当然,您可以通过将 传递给单元格来使单元格知道其位置,然后indexPath.row在需要时将文本设置为粗体。我不知道这会怎么玩dequeueReusableCellWithIdentifier:

于 2012-09-10T21:38:43.050 回答
2

我的正常方法是A)和B)的结合......

我使用类别将value属性添加到 UITableViewCell。然后我创建一个或多个 UITableViewCell 的子类,每个子类用于我要显示的每种类型的行/值。

在我tableView:cellForRowAtIndexPath:的数据源方法中,我将适当子类的单元格出列/分配并设置value为要为该行显示的值。

也许其他人可以帮助使用UITableViewController——我个人认为它不是很有用。我通常只是为我正在显示的每种类型的视图子类化 UIViewController。如果该视图包含一个表视图,我给我的视图控制器一个tableView出口。这类似于为我需要的每种类型的单元格子类化 UITableViewCell。

于 2012-09-10T21:34:01.723 回答
1

我已经开始做 B (它看起来如此不可抗拒),我还没有遇到过问题。

我是怎么做到的,单元子类对模型对象有一个弱引用。控制器给它一个引用,并配置它的属性以在 setRefence: 方法中显示。

单元子类将仅用于显示模型项。这意味着我的控制器代码既漂亮又干净(我的意思是小而简单),这意味着单元变体很容易制作和插入,实际上您可以开始进一步概括它并使用只需添加的子类控制您的显示器所需的配置差异。一个有趣的应用程序有多个表格,每个表格都有特定的单元格,代码会少得多——可以使用通用控制器,单元格子类和模型包含它们的细节。

我还看不到缺点。

“但是如果你想在另一个项目中重用那个类怎么办?” - 我会重用模式,而不是代码。

“但是您将显示对象与其显示的数据紧密耦合” - 那又如何?它们协同工作——控制器建立关系并协调它们——这就是它的用途。让您的视图引用他们的模型。

(我在这里发帖是因为我想知道如果这种方法是错误的(并且我已经看到它被列为一种罪过)那么为什么它是错误的?)。

于 2013-09-01T20:14:56.317 回答
0

“配置”是什么意思?您是说将 Person 的数据添加到单元格中吗?我会在 中执行此操作cellForRowAtIndexPath:,这通常是视图控制器的一部分(通常将表视图的委托设置为视图控制器)。理想情况下,Person 的数据是应用程序中某个模型的一部分。您可以使用索引路径获取单元格的 Person ,例如

Person *personForThisCell = [SomeModel getPersonAtIndex: [indexPath row]];

然后使用该数据设置单元格的值。

于 2012-09-10T21:37:11.983 回答