我正在使用Storyboard在iPad 6.0中开发一个应用程序。
首先让我解释一下我的目标。我正在尝试使用2个UITableViewControllers来实现Master-Detail(类似SplitViewController)的View Controller。
第一个UITableView(“Master”),让我们称之为 HeaderTableView ,正如其名称所暗示的那样,列出了...的标题。
...第二个UITableView(“详细信息”),我们称之为 EncodingTableView ,其中包含一个以编程方式更改的CustomTableViewCell(每个单元格中包含的子视图可能是UITextField,UIButton或UISwitch)。 / p>
参见 EncodingTableView.m
- (void)updateEncodingFields:(NSArray *)uiViewList
{
// Add logic for determining the kind of UIView to display in self.tableView
// Finally, notify that a change in data has been made (not working)
[self.tableView reloadData];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *encodingFieldsTableId = @"encodingFieldsTableId";
CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:encodingFieldsTableId];
if (cell == nil) {
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:encodingFieldsTableId];
}
// Change text in textView property of CustomTableViewCell
cell.encodingFieldTitle.text = uiViewList.title;
// added methods for determining what are to be added to [cell.contentView addSubView:]
// data used here is from the array in updateEncodingFields:
}
我的 HeaderTableView.m ,包含didSelectRowAtIndexPath以更新 EncodingTableView
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (![selectedIndexPath isEqual:indexPath]) {
selectedIndexPath = indexPath;
[self updateDataFieldTableViewForIndexPath:indexPath];
}
}
- (void)updateDataFieldTableViewForIndexPath:(NSIndexPath *)indexPath {
[self.encodingTableView updateEncodingFields:self.uiViewList];
}
的问题
- 数据都可以,但为什么 EncodingTableView “重绘”字段?我的
怀疑是重复使用细胞与此有关,但我无法弄清楚原因。
结果屏幕截图:
HeaderTableView中的初始选择
HeaderTableView中的第二个选择
我尝试了什么:
限制: 我知道一个好主意是使用SplitViewController,但这只是我的应用程序的子部分(因此不是RootViewController)。
最后,感谢阅读这么长的帖子。 ;)
答案 0 :(得分:5)
看起来您最有可能在tableView:cellForRowAtIndexPath:
内添加子视图。
问题是如果你使用单元格重用,那么并不总是从tableView:cellForRowAtIndexPath:
内的空白平板开始,而是可以给你一个已经配置一次的单元格。这就是您所看到的,之前添加了标签的单元格将被传回给您,然后您在顶部添加更多标签。
有几种方法可以解决这个问题:
(我的首选选项)创建UITableViewCell
的子视图,并将这些额外的子视图作为属性提供。
确保单元设置仅执行一次
这样做的好地方是当你实际创建一个单元格时,例如在if (cell)
支票
if (cell == nil) {
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:encodingFieldsTableId];
// add subview's here and give them some way to be referenced later
// one way of doing it is with the tag property (YUK)
UILabel *subView = [[UILabel alloc] initWithframe:someFrame];
subView.tag = 1;
[cell.contentView addSubview:subView];
}
UILabel *label = (id)[cell.contentView viewWithTag:1];
label.text = @"some value";
答案 1 :(得分:2)
我在代码中看到的一个问题是tableView cellForRowAtIndxPath函数中使用的单元格标识符不同。
在您使用此标识符出列时 - > " encodingFieldsTableId"
&安培;
创建正在使用此标识符的单元格时- > " dataFieldUiGroupTableId"
理想情况下,这两个标识符应该相同!!!
答案 2 :(得分:1)
尝试添加,
cell.encodingFieldTitle.text = nil;
在if(cell == nil)
之前
因此,无论何时调用cellForRowAtIndexPath
方法,您要重复使用的单元格中已存在的字符串都将被删除,并且uiViewList.title
中的新文本将会显示。