我有一个静态UITableView
从故事板构建,效果很好。我想以编程方式填写第一类,来自用户定义的文件
简单地说,我想遍历数组中的所有字符串,并将它们添加为第一类行的单元格。对于第二类,我有一系列温和复杂的单元格(包含许多标签,文本字段,按钮和其他控件),在故事板中定义,我不想在代码中重新创建。
据我了解,从故事板构建的UITableView
的默认行为是将nib
文件用作隐式datasource
。如果我将自定义类用作datasource
,则我的第二部分不起作用。我想到了两种可能的解决方法:
datasource
填写我的第一个类别,并将其余类别委托给nib
文件。这可能吗?是否有一些方法可以通过编程方式请求nib
填充我的UITableView
?datasource
中。这种方法的缺点是使我的第二类难以修改。这两个选项中的一个是否可行?还有其他选择吗?
答案 0 :(得分:1)
使用Storyboard时有两种表格视图:
您目前正在使用前者。您可以在故事板中定义所有内容,并且只需很少的代码。
但你需要改变后者。
您仍然可以将UITableViewCell
保留在故事板中;没有必要在代码中执行此操作(尽管如果它可以使事情变得更容易)。您可以使用“重用标识符”来引用模板单元格。
否则你已经得到了它。您需要编写代码来实现数据源和(可能)表视图委托的更多方法。
从静态变为动态是一种繁琐的转变。我一直有意义提出雷达,因为我确信Xcode可以让它变得更容易......
答案 1 :(得分:1)
我会使用动态原型单元格。然后,我会将ViewController
设置为delegate
和dataSource
。然后,我将创建UITableViewCell
的自定义子类,并将第二部分的元素连接到自定义IBOutlet
中的UITableViewCell
。
如果第一部分不能用其中一种通用单元格类型完成,我也会为该部分创建UITableViewCell
的自定义子类。
然后我会使用cellForRowAtIndexPath:
方法设置包含我想要的信息的单元格。因此,如果我的第一部分使用FirstSectionCell
而我的第二部分使用SecondSectionCell
作为UITableViewCell
的自定义子类,则我的cellForRowAtIndexPath:
将如下所示:
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.section==0)
{
FirstSectionCell *firstCell = [tableView dequeueReusableCellWithIdentifier:@"First Cell Prototype"];
//Set up the first cell.
return firstCell;
}
else if(indexPath.section ==1)
{
SecondSectionCell *secondCell = [tableView dequeueReusableCellWithIdentifier:@"Second Cell Ptototype"];
//Set up second cell.
secondCell.someLabel.text = @"whatever";
//etc.
return secondCell;
}
else
{
//if you have another section handle it here.
}
}