表格视图重新加载部分崩溃

时间:2014-11-05 13:12:12

标签: ios objective-c uitableview reload sections

我有一个包含4个部分的表视图,每个部分有1-2个表视图单元格。第一个单元格具有uiswitch作为附件视图,并控制应用程序的颜色主题,在白天模式和夜晚模式之间切换。一旦按下开关,就会调用一个函数,改变导航栏的颜色和背景颜色。在那个函数中我也放了一行

[self.tableview reloadData];

使用新颜色更新表格本身。它工作正常,但它没有动画,所以我用它来代替

[self.tableView reloadSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 3)] withRowAnimation:UITableViewRowAnimationFade];

当使用该行时,开关卡住并且应用程序冻结。它没有崩溃,即没有崩溃日志,只是冻结,uiswitch停止动画中期。

我注意到我可以重新加载没有包含附件视图的单元格的部分,并且它与淡入淡出动画完美配合。即这工作

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:2] withRowAnimation:UITableViewRowAnimationFade];

因为第三部分没有任何带附件视图的单元格。但是任何包含附件视图的单元格(即第0和第2部分)的部分,如果我尝试重新加载应用程序会冻结。

为什么会发生这种情况?下面是我的cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *cellIdentifier;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];

if (indexPath.section == 0) {

    cell.textLabel.text = [section0 objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (indexPath.row == 0) {

        cell.accessoryView = colorSchemeSwitch;
    }

    else if (indexPath.row == 1) {

        cell.accessoryView = autoLockSwitch;
    }
}

else if (indexPath.section == 1) {

    cell.textLabel.text = [section1 objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}

else if (indexPath.section == 2) {

    cell.textLabel.text = [section2 objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%i \t", (int)app.fontSize];
    fontSizeSlider.value = app.fontSize;
    cell.accessoryView = fontSizeSlider;
}

else if (indexPath.section == 3) {

    cell.textLabel.text = [section3 objectAtIndex:indexPath.row];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.detailTextLabel.text = app.color;
}

cell.backgroundColor = app.cellBackgroundColor;
cell.textLabel.textColor = app.textColor;
UIView *backgroundColorView = [[UIView alloc] init];
backgroundColorView.backgroundColor = app.cellSelectedColor;
[cell setSelectedBackgroundView:backgroundColorView];

return cell;
}

3 个答案:

答案 0 :(得分:6)

我在包含UITableViewCell的{​​{1}}中遇到了同样的问题。我在重新加载部分之前调用UISwitch解决了这个问题:

[self.tableview reloadData]

如果您致电:

,则会出现同样的问题
NSIndexSet *sections = [[NSIndexSet alloc] initWithIndex:2];
[self.tableView reloadData];
[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationFade];

首先不重新加载数据。

答案 1 :(得分:4)

您还没有添加崩溃日志,但我猜测您收到的错误表明某个部分中的现有行数必须等于更新前的某个值。如果是这样, 您是否在重新加载表之前使用[self.tableview beginUpdates]并在重新加载后使用[self.tableview endUpdates]

答案 2 :(得分:0)

在尝试重新加载特定行时遇到了同样的问题。我的dataSource不一致。因为我正在从远程加载数据。我发现这个link解决了这个问题。 但是我需要修改这一行。

let sections = dataSource.numberOfSections?(in: self) ?? 0

收件人

let sections = dataSource.numberOfSections?(in: self) ?? 1