静态tableView单元格在视图加载时不显示复选标记

时间:2016-02-14 22:15:55

标签: ios swift uitableview

我有一个tableview控制器,我将其用作首选项屏幕。它有三个部分,每个部分都有静态单元格。 第三部分有6行,每行代表不同的日期格式,但根据设备的不同,并非所有行都在视图加载时出现。 我使用checkmark accessoryType来表示是否已选择特定选项。 (我从我的Realm数据库商店获得)

在IB的tableview中,我将所有单元格设置为具有accessoryType - .None,因此最初没有选中标记。

当视图出现时,我检索存储的值并设置相应的复选标记。

 for (index,selDateFormat) in dateFormats.enumerate() {
   if selDateFormat == dateFormat {
         tableView.cellForRowAtIndexPath(NSIndexPath(forRow: index, inSection: 2))?.accessoryType = .Checkmark
   } else {
          tableView.cellForRowAtIndexPath(NSIndexPath(forRow: index, inSection: 2))?.accessoryType = .None
   }

}

如果在iPhone 6 plus上可以查看该行,那么效果很好,我很棒。但是,在iPhone 4s上,只有前两行显示在此部分中,直到我滚动。问题是如果我在第3 - 6行中选择了一个选项,则不会显示复选标记,因为当视图出现时它不在视图范围内。 有没有办法让我可以在视图出现时显示复选标记?

2 个答案:

答案 0 :(得分:0)

对于屏幕外的行,cellForRowAtIndexPath将返回nil。当在屏幕上滚动行时,您需要在创建单元格时设置复选标记(或不设置)。覆盖cellForRowAtIndexPath并根据需要设置复选标记:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)
    if let selDateRow = dateFormats.indexOf(selDateFormat) {
        if (indexPath.row == selDateRow) {
            cell.accessoryType = .Checkmark
        } else {
            cell.accessoryType = .None
        }
    } else { // just in case selDateFormat isn't in the dateFormats array...
        cell.accessoryType = .None
    }
    return cell
}

答案 1 :(得分:0)

事实证明答案在代码中更简单

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)
    let section = indexPath.section
    if section == 2 {

        if dateFormats[indexPath.row] == dateFormat {
            cell.accessoryType = .Checkmark
        } else {
            cell.accessoryType = .None
        }

    }
    return cell
}