ios - 删除表格单元格时重新加载详细 View - Swift

标签 ios uitableview swift

我有一个 Split View Controller (主从)。我正在针对 iPhone 6 Plus 对其进行优化。

问题来了。当您选择一个单元格时,它会执行 show-detail segue 并在详细 View 中显示单元格信息。但是,当您删除一个单元格时,详细 View 会保留单元格信息,即使该单元格不再存在也是如此。

这是一个例子:

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 = "Select an item",以便 View 不再显示已删除的单元格。我尝试通过代码制作一个新的 segue。运气不好。

想法?

最佳答案

执行以下操作:

  1. 确保设置详细 View Controller 的转场具有标识符。在示例 Master-Detail 项目中,标识符是 "showDetail"。您可以通过在项目的 Document Outline View 中选择 segue,然后在 Attributes Inspector 中查看 Identifier Field 来找到标识符对于 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"
                    ...
            }
        }
    }
    

注意:如果您的详细信息 View Controller 在未设置 detail.title 时具有默认状态,并且此默认状态是您希望目标 View Controller 在没有行被设置时的样子选中,那么您甚至不需要 prepareForSegue 中的 else 子句。示例 Master-Detail iOS 应用就是这种情况。只需要从编辑代码中以编程方式调用 segue,就可以了。

关于ios - 删除表格单元格时重新加载详细 View - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26821345/

相关文章:

ios - 测试互联网连接不适用于 Reachability

android - Phonegap 推送通知以打开特定的应用程序页面

ios - 如何增加 UICollectionViewCell 高度并在 Swift 中单击按钮后显示标签

ios - UIBarButtonSystemItemPageCurl 不显示,其他系统图标显示

ios - 在 Adob​​e AIR 中将特定影片剪辑写入位图

ios - UITableViewCell 文本颜色在选择行时发生变化,为什么?

IOS 如何获取 xib 文件加载时的事件?

ios - 选择时 UISearchBar 的宽度和位置会发生变化

ios - 在同一天快速安排 UILocalNotification

Swift - 完成后重置/重启 SpeechSynthesizer