UITableView accessoryType在UITableView的后半部分中消失
我有一个iPad应用程序(XCode 4.6,ARC,Storyboards,iOS 6.2.3)。 我有一个UITableView的UIPopover,它有21行。 我可以在所有行中随机设置accessoryType ,但只有在前12行中, 辅助类型设置(复选标记)才会保留,因此可以在另一种方法中检查并处理。 我没有看到前12行和最后9行之间有任何区别。 UITableView是可滚动的,所以要到达第11行之后的行,您必须滚动到底部
以下是设置accessoryType的代码:
#pragma mark didSelectRowAtIndexPath
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// get the cell that was selected
UITableViewCell *theCell = [tableView cellForRowAtIndexPath:indexPath];
if(theCell.accessoryType != UITableViewCellAccessoryCheckmark)
theCell.accessoryType = UITableViewCellAccessoryCheckmark;
else
theCell.accessoryType = UITableViewCellAccessoryNone;
}
这里是我检查accessoryType并处理它的代码:
-(void) moveServices { // (moves checked tableViewRows to services tableview)
NSMutableString *result = [NSMutableString string];
for (int i = 0; i < [servicesArray count]; i++) {
NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
[tvServices scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
UITableViewCell *cell = [tvServices cellForRowAtIndexPath:path];
if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
[result appendFormat:@"%@, ",cell.textLabel.text];
NSLog(@"nni: %dncell.accessoryType: %dncell.textLabel: %@",i,cell.accessoryType, cell.textLabel);
}
}
if (result.length > 2) { // move to text box in main menu
storeServices =[result substringToIndex:[result length] - 2];
}
}
它看起来像是混合了“数据源”的概念和表格中单元格的内容。 不要这样做 - 将特定单元格的设置与某个特定单元格是否显示复选标记分开存放(无论表格中是否有特定行应显示基于程序逻辑的复选标记)。 然后在cellForRowAtIndexPath
,构建单元以匹配数据源的当前设置。 原因是UITableView重用了基于哪些行在屏幕上可见的单元实例(这只是一个很好的MVC设计)。
在你的情况下,你应该在你的类中保留一个NSMutableArray
属性来记录整个表的设置,并使用cellForRowAtIndexPath
该数组的值来设置该特定的单元格。 然后,控制器中的其他“业务逻辑”方法使用数组属性来查询模型状态,而不是单元格设置(这是视图的一部分,应该独立于数据模型)。
上一篇: UITableView accessoryType disappears in last half of UITableView
下一篇: Modify didSelectRowAtIndexPath for StoryBoard Usage, IOS