我有一个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
我没有忘记在故事板中设置单元格标识符。
答案 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
...
}
(根据需要替换forRow
和inSection
参数的值)
答案 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
取回;并使用复选标记检查第一个单元格。