簡體   English   中英

UISplitViewController,重用DetailViewController(Swift)

[英]UISplitViewController, reuse DetailViewController (Swift)

設置:在Xcode中創建樣板iOS Master-Detail應用並運行它。 每次單擊主項目時,它都會重新創建detailVC並將其配置為顯示新數據。

前提:通常這就是我想要的,但是有時它所做的只是更改單個標簽中的文本。 重用現有的DetailVC更加有意義嗎? (至少在這種情況下)

那么最好的方法是什么?

沉思:當我查看樣板代碼時,我看到MasterVC為detailVC創建了類范圍的var。

var detailViewController: DetailViewController? = nil

它在viewDidLoad設置此值,但是從不將其用於任何東西。 ?? prepare(for:sender:)我們獲得此代碼

let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController

這將創建一個DetailViewController的新實例。 如果在創建斷點后將其插入,並將其與var detailViewController類進行比較,您會發現它們是不同的。

UIStoryboardSegue正在創建我的新DetailViewController ,可以通過查看文檔輕松地對其進行確認。

您不能直接創建segue對象。 相反,情節提要運行時必須在兩個視圖控制器之間執行segue時才創建它們。

我可以刪除行選擇中的segue並在我的detailVC上手動調用該方法,這可能是最簡單的,但是IB中的segue如此純凈而直觀。 我可能可以創建自定義序列。 我還能做什么,並且有明確的“最佳”方法嗎?

如果有人有這個問題,這是我的解決方案,直到有人提出更好的建議。

轉到Interface Builder並刪除從主tableview到detailVC的showDetail segue。 然后進入MasterViewController類,並刪除prepare(for:sender:)函數。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = tableView.indexPathForSelectedRow {
            let object = objects[indexPath.row] as! NSDate
            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
            controller.detailItem = object
            controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }
}

在“表視圖”區域中創建一個新函數(此新函數是UITableViewDelegate一部分)

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
     detailViewController?.detailItem = object
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM