设置静态表格视图单元格的复选标记
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
...
(根据需要替换forRow
和inSection
参数的值)
【讨论】:
感谢您的回答。直到现在我才使用这个功能。你能告诉我我的代码在我的情况下是如何工作的吗? 不完全,因为我不知道具体细节。我希望您可以在我更新的答案中使用该示例。 谢谢!编译器向我显示您的代码错误:从 'UITableViewCell?' 向下转型到 'UITableViewCell' 只解开选项;你的意思是使用'!'?所以我设置了一个“!”在 UITableViewCell 后面,我的应用再次因我的第一篇帖子的错误而崩溃 抱歉 - 应该是as
而不是 as!
。我不确定为什么tableView.cellForRowAtIndexPath
仍然返回零。索引路径 0-0 是否正确?
如果我删除“!”在 von as 之后,编译显示相同的错误。是的,0-0 必须是正确的 - 我只有一个包含 3 个单元格的部分以上是关于设置静态表格视图单元格的复选标记的主要内容,如果未能解决你的问题,请参考以下文章
如何在单元格渲染后检查表格视图上的复选标记图标(附件视图)?