我有一个拆分视图控制器(master-detail)。我正在为iPhone 6 Plus优化它。
这是问题所在。选择单元格时,它会执行show-detail segue并在详细视图中显示单元格信息。但是,当您删除单元格时,即使单元格不再存在,详细视图也会保留单元格信息。
以下是一个例子:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if (editingStyle == UITableViewCellEditingStyle.Delete) {
//code that deletes my cell/not needed for example
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Left)
let splitController = self.splitViewController!.viewControllers
self.detailViewController = splitController.last? as? detailedController
if let detail = detailViewController {
detail.title = "Select an item"
//detail.title is a variable in the view controller
//on the views "viewDidLoad" it sets a label.text as title.
}
}
}
我想执行操作:detail.title =“选择一个项目”,以便视图不再显示已删除的单元格。我尝试通过代码创建一个新的segue。没有运气。
想法?
答案 0 :(得分:3)
执行以下操作:
确保设置详细视图控制器的segue具有标识符。在示例 Master-Detail 项目中,标识符为"showDetail"
。您可以通过在项目的文档大纲视图中选择segue来查找标识符,然后查看属性检查器中的标识符字段 对于segue。
删除行时以编程方式调用此segue:
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
// Call showDetail when in a splitViewController and 2 view controllers
// are present
if self.splitViewController?.viewControllers.count == 2 {
self.performSegueWithIdentifier("showDetail", sender: self)
}
...
在prepareForSegue
中,请务必检查所选行。当您从单元格删除代码中调用segue时,将不会选择任何行,indexPathForSelectedRow()
将返回nil
:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
// set up destination view controller in the normal way
...
} else {
// No row was selected which means either this is the initial setup
// or we came here from the row delete code
let splitController = self.splitViewController!.viewControllers
self.detailViewController = splitController.last? as? detailedController
if let detail = detailViewController {
detail.title = "Select an item"
...
}
}
}
注意:如果您的详细视图控制器具有未设置detail.title
的默认状态,并且此默认状态是您希望目标视图控制器在未选择任何行时的样子,那么您不需要甚至需要else
中的prepareForSegue
条款。示例 Master-Detail iOS应用程序就是这种情况。只需要从编辑代码中以编程方式调用segue,这一切都可以正常工作。
答案 1 :(得分:0)
不要不必要地检查序列机制,因为它会变得混乱。取而代之的是,在prepareForSegue中保留详细视图控制器,这与viewDidLoad对其保留的方式相同(在默认的主/详细模板中)。然后,在致电self.detailViewController.detailItem = nil
之后设置tableView.deleteRowsAtIndexPaths
。然后,在详细视图控制器中,当您收到nil时,将视图恢复为无项目时显示默认消息。
此模式将为您进行UI状态还原提供完美的设置,因为您可以以相同的方式在detailViewController上设置detailItem,但是可以通过MasterViewController的decodeRestorableStateWithCoder
解码@"CurrentDetailItem"
来进行。