删除表格单元格时重新加载详细信息视图 - Swift

时间:2014-11-08 19:47:49

标签: ios uitableview swift

我有一个拆分视图控制器(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。没有运气。

想法?

2 个答案:

答案 0 :(得分:3)

执行以下操作:

  1. 确保设置详细视图控制器的segue具有标识符。在示例 Master-Detail 项目中,标识符为"showDetail"。您可以通过在项目的文档大纲视图中选择segue来查找标识符,然后查看属性检查器中的标识符字段 对于segue。

  2. 删除行时以编程方式调用此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)
            }
            ...
    
  3. 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"
                    ...
            }
        }
    }
    
  4. 注意:如果您的详细视图控制器具有未设置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"来进行。