![](/img/trans.png)
[英]Update frame of DetailViewController in subclass of UISplitViewController
[英]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.