我有一个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行中选择了一个选项,则不会显示复选标记,因为当视图出现时它不在视图范围内。 有没有办法让我可以在视图出现时显示复选标记?
答案 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
}