我有一个代表Person
和UITableViewCell
子类的实体,它显示了所述人的一些属性。
问题是:你在哪里通常配置(设置文本,图片等)表格单元格?你:
A)在实施UITableViewController
?
tableView:cellForRowAtIndexPath:
子类中配置它
B)将Person对象传递给UITableViewCell
子类,让子类自行配置?
C)完全不同的东西?
如果你回答了选项A,那么这个呢?
假设对于表格视图中的第一行,我需要加粗所有标签的文本。这会改变你的意见吗?你看到我在这里得到的东西,如果你在视图控制器中配置单元格,视图控制器将变得臃肿,而不是真正需要的信息。但是,如果将所有配置放在表格单元子类中,则会失去一些可重用性。这绝对是一种权衡,但我想知道大多数工程师选择的是什么。
答案 0 :(得分:3)
转到界面构建器并选择单元格。使用检查器,再次按自定义UITableViewCell
链接您的单元格。
之后,在tableView:cellForRowAtIndexPath:
而不是UITableViewCell
实例化您的单元格,配置它并使用voilá。
然后,回答你的评论:
将单元格项目链接到“自定义”单元格标题中的属性。
假设我在此示例中创建了属性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}}
然后使用该数据设置单元格的值。