0

我有一个 iPad 应用程序(XCode 4.6、ARC、Storyboards、iOS 6.2.3)。我有一个带有 21 行的 UITableView 的 UIPopover。我可以在所有行中随机设置附件类型,但仅在前 12 行中附件类型设置(复选标记)保持不变,因此可以在另一种方法中检查并处理它。我看不出前 12 行和后 9 行之间有任何区别。UITableView 是可滚动的,因此要到达第 11 行之后的行,您必须滚动到底部

这是设置附件类型的代码:

#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;
}

这是我检查附件类型并处理它的代码:

-(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(@"\n\ni: %d\ncell.accessoryType: %d\ncell.textLabel: %@",i,cell.accessoryType, cell.textLabel);
    }
}

if (result.length > 2) {  //  move to text box in main menu
    storeServices =[result substringToIndex:[result length] - 2];
}

}

4

1 回答 1

0

看起来您正在混合“数据源”的概念和表格中单元格的内容。不要那样做 - 将您的数据源(表中的特定行是否应根据您的程序逻辑显示复选标记)与特定单元格的设置(特定单元格是否显示复选标记)分开。然后在 中cellForRowAtIndexPath,构建单元格以匹配数据源的当前设置。原因是 UITableView 根据屏幕上可见的行重用单元格实例(这只是很好的 MVC 设计)。

在您的情况下,您应该NSMutableArray在类中保留一个记录整个表设置的属性,并使用该数组中的值cellForRowAtIndexPath来设置该特定单元格。然后控制器中的其他“业务逻辑”方法使用数组属性来查询模型状态,而不是单元格设置(它们是视图的一部分,应该独立于数据模型)。

于 2013-07-17T16:07:56.050 回答