设置静态表格视图单元格的复选标记

Posted

技术标签:

【中文标题】设置静态表格视图单元格的复选标记【英文标题】:Set checkmark for static table view cell 【发布时间】:2015-08-08 14:03:56 【问题描述】:

我有一个装有 ios 8 和 Swift 的 iPhone 应用程序。

我想在一个有 3 行的静态表格视图中设置复选标记附件。我在保存字符串的地方使用 NSUserdefaults。对于复选标记,我使用以下代码:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    var identifier = defaults.objectForKey("Sort") as! String
    let cell = tableView.dequeueReusableCellWithIdentifier("\(identifier)") as! UITableViewCell
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark
    return cell


但它不起作用。我总是得到错误:

致命错误:在展开可选值时意外发现 nil

在这一行:

let cell = tableView.dequeueReusableCellWithIdentifier(identifier) as! UITableViewCell

我没有忘记在情节提要中设置单元格标识符。

【问题讨论】:

【参考方案1】:

由于您使用的是静态单元格,在这种情况下您只有 3 个,您可以在情节提要中设置 IBOutlet

@IBOutlet weak var cell1: UITableViewCell!
@IBOutlet weak var cell2: UITableViewCell!
@IBOutlet weak var cell3: UITableViewCell!

随后,当您仍在故事板中时,请通过单击右侧的Attributes Inspector 为每个单元格设置标签。

为了测试,我将标签设置为 0 - 2(即 0、1、2)。

我猜您在主控制器中保存了一个String 值,一旦单击,您希望通过再次从NSDefault 中获取该值来使相应的单元格具有复选标记。

您可以在方法中执行此操作(Swift-wise: function):

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) 

这是我提出的快速测试:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)


    NSUserDefaults.standardUserDefaults().setObject("0", forKey: "Sort")
    NSUserDefaults.standardUserDefaults().synchronize()


    let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
    var aString = defaults.valueForKey("Sort") as? String

    let cellIndex = aString?.toInt()

    if cell1.tag == cellIndex
    
        cell1.textLabel!.text = "Hallo, I am cell 1"
        cell1.accessoryType = UITableViewCellAccessoryType.Checkmark
    
    else if cell2.tag == cellIndex
    
        cell2.textLabel!.text = "Hello, I am cell 2"
        cell2.accessoryType = UITableViewCellAccessoryType.Checkmark
    
    else if cell3.tag == cellIndex
    
        cell3.textLabel!.text = "Hello, I am cell 3"
        cell3.accessoryType = UITableViewCellAccessoryType.Checkmark
    


作为测试,我将其设置为0,并立即从NSDefault取回;并且第一个单元格带有复选标记。

【讨论】:

【参考方案2】:

如果您使用静态表格视图单元格,tableView.dequeueReusableCellWithIdentifier始终返回 nil。这会导致错误。

作为替代方案,您可以在viewWillAppear 函数中设置校验码。在那里,您可以通过tableView.cellForRowAtIndexPath 函数访问单元格:

override func viewWillAppear(_ animated: bool) 
    super.viewWillAppear(animated)

    let cell = tableView.cellForRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 0)) as UITableViewCell
    cell.accessoryType = UITableViewCellAccessoryType.Checkmark

    ...

(根据需要替换forRowinSection参数的值)

【讨论】:

感谢您的回答。直到现在我才使用这个功能。你能告诉我我的代码在我的情况下是如何工作的吗? 不完全,因为我不知道具体细节。我希望您可以在我更新的答案中使用该示例。 谢谢!编译器向我显示您的代码错误:从 'UITableViewCell?' 向下转型到 'UITableViewCell' 只解开选项;你的意思是使用'!'?所以我设置了一个“!”在 UITableViewCell 后面,我的应用再次因我的第一篇帖子的错误而崩溃 抱歉 - 应该是 as 而不是 as!。我不确定为什么tableView.cellForRowAtIndexPath 仍然返回零。索引路径 0-0 是否正确? 如果我删除“!”在 von as 之后,编译显示相同的错误。是的,0-0 必须是正确的 - 我只有一个包含 3 个单元格的部分

以上是关于设置静态表格视图单元格的复选标记的主要内容,如果未能解决你的问题,请参考以下文章

关闭 UITableView 静态单元格中的复选标记

如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?

使附件类型成为选定单元格的复选标记

TableView Cell 重用和不需要的复选标记 - 这让我很生气

带有复选标记和详细信息披露的表格视图

对具有多行表格单元格的表格中的多行使用标签标记