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

时间:2015-08-08 14:03:57

标签: ios iphone swift uitableview

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

我想在3行的静态表视图中设置checkmark附件。我使用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

我没有忘记在故事板中设置单元格标识符。

2 个答案:

答案 0 :(得分:1)

如果您使用静态表格查看单元格,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参数的值)

答案 1 :(得分: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取回;并使用复选标记检查第一个单元格。