你在哪里配置UITableViewCell子类?

时间:2012-09-10 21:30:20

标签: objective-c ios cocoa-touch uitableview

我有一个代表PersonUITableViewCell子类的实体,它显示了所述人的一些属性。

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

A)在实施UITableViewController

时,在tableView:cellForRowAtIndexPath:子类中配置它

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

C)完全不同的东西?

奖励积分

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

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

4 个答案:

答案 0 :(得分:3)

转到界面构建器并选择单元格。使用检查器,再次按自定义UITableViewCell链接您的单元格。

Inspector

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

然后,回答你的评论:

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

假设我在此示例中创建了属性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.在UITableViewCell内加载数据是一项不寻常的任务,因为它应该非常快速地处理滚动。将数据放在其中是不可行的。

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

一起发挥作用

答案 1 :(得分:2)

我的常规方法是A)和B)......

的组合

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

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

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

答案 2 :(得分:1)

我已经开始做B了(它看起来似乎不可抗拒),而且我还没有遇到问题。

我是怎么做的,是细胞子类对模型对象的弱引用。 Controller为它提供引用,并配置其属性以便在setRefence:方法中显示。

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

我看不出有什么缺点。

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

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

(我在这里发帖是因为我想知道如果这种做法错了(我已经把它列为犯罪)那么为什么这是错的?)。

答案 3 :(得分:0)

“配置”是什么意思?你的意思是将Person的数据添加到单元格中吗?我会在cellForRowAtIndexPath:中执行此操作,Person *personForThisCell = [SomeModel getPersonAtIndex: [indexPath row]]; 通常是视图控制器的一部分(通常将表视图的委托设置为视图控制器)。 Person的数据理想地是应用程序中某些模型的一部分。您可以使用索引路径获取单元格的Person,例如

{{1}}

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