如何在 Master 和 Detail 视图之间 segue *without* storyboard?
How to segue *without* storyboard between Master and Detail view?
我完全以编程方式创建了一个 Master-Detail 项目,也就是说没有任何故事板(我删除了文件)。
我想不通的是如何在主视图 (MV) 和详细视图 (DV) 之间切换
我试过了
self.showViewController(detailViewController, sender: self)
和
self.showDetailViewController(detailViewController, sender: self)
来自MV,但实际上并没有用。
我的 MV 的 table 充满了单元格,当按下这些单元格时,应该缩放到我的 DV 中 mapView 上的注释。
由于某些原因,DV中的地图和MV中的table在打开应用程序时第一次加载后没有刷新。
我正在使用自定义对象在视图之间传递数据
MV:
detailViewController.setRequired(self.customObject)
self.showDetailViewController(detailViewController, sender: self)
self.tableView.reloadData()
其中 "setRequired" 是一个函数,它将 DV 的 class 变量设置为来自 MV 的更新值(至少这部分有效)
DV:
super.viewDidLoad()
mapView = MKMapView()
mapView.mapType = .Standard
mapView.frame = view.frame
mapView.delegate = self
view.addSubview(mapView)
self.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
self.navigationItem.leftItemsSupplementBackButton = true
populateMap(extractedObject)
其中 "populateMap" 是一个获取对象(值是正确的,不用担心)的函数,旨在用新信息填充地图。
正如我所说,mapView 不会更新,table 也不会。
有什么想法吗?
(提醒,没有情节提要 文件,当然是故意的)
提前致谢!
乔纳
编辑
关注 vacawama 的回答:
是的,我的 masterViewController 嵌入在 UINavigationController 中。在 MVC 的 viewDidLoad 中我有
let controllers = self.splitViewController!.viewControllers
self.detailViewController = controllers[controllers.count-1].topViewController as DetailViewController},
但是当我尝试 self.navigationController.pushView... 建议时,我收到以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
上线let controllers = ...
EDIT 到 Edit
即使解决了 found nil 问题,地图和 table 似乎也无法上传。有什么想法吗?
Segues 是故事板创作。如果您没有 Storyboard,则无法继续。如果您的 masterViewController
嵌入在 UINavigationController
中,则移动到 detailViewController
的编程方式是:
self.navigationController.pushViewController(detailViewController, animated: true)
如果您的 masterViewController
没有嵌入 UINavigationController
,那么您可以模态显示 detailViewController
:
self.presentViewController(detailViewController, animated: true, completion: nil)
更新:
在您更新的问题中,您提到了 SplitViewController
。
我最初的回答为您提供了 iPhone 的信息。对于 SplitViewController,Master 和 Detail 同时出现在屏幕上,因此不需要加载新的 ViewController(这是 segue 所做的)。只需将需要发送到 detailViewController
的数据写入 属性 或属性,然后调用一个方法让 detailViewController
刷新它的视图。您甚至可以在 detailViewController
.
中的 属性 上使用 didSet
自动执行此操作
请注意,当您更新 detailViewController
时,viewDidLoad
不会 运行。您需要提取更新 detailViewController
的 UI 的代码。将其命名为 updateUI
。然后从 viewDidLoad
和数据更新时调用 updateUI
。我建议在您的 customData 属性 上实施 didSet
并从那里调用 updateUI
。
我完全以编程方式创建了一个 Master-Detail 项目,也就是说没有任何故事板(我删除了文件)。
我想不通的是如何在主视图 (MV) 和详细视图 (DV) 之间切换
我试过了
self.showViewController(detailViewController, sender: self)
和
self.showDetailViewController(detailViewController, sender: self)
来自MV,但实际上并没有用。
我的 MV 的 table 充满了单元格,当按下这些单元格时,应该缩放到我的 DV 中 mapView 上的注释。
由于某些原因,DV中的地图和MV中的table在打开应用程序时第一次加载后没有刷新。
我正在使用自定义对象在视图之间传递数据
MV:
detailViewController.setRequired(self.customObject)
self.showDetailViewController(detailViewController, sender: self)
self.tableView.reloadData()
其中 "setRequired" 是一个函数,它将 DV 的 class 变量设置为来自 MV 的更新值(至少这部分有效)
DV:
super.viewDidLoad()
mapView = MKMapView()
mapView.mapType = .Standard
mapView.frame = view.frame
mapView.delegate = self
view.addSubview(mapView)
self.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
self.navigationItem.leftItemsSupplementBackButton = true
populateMap(extractedObject)
其中 "populateMap" 是一个获取对象(值是正确的,不用担心)的函数,旨在用新信息填充地图。
正如我所说,mapView 不会更新,table 也不会。
有什么想法吗?
(提醒,没有情节提要 文件,当然是故意的)
提前致谢!
乔纳
编辑
关注 vacawama 的回答:
是的,我的 masterViewController 嵌入在 UINavigationController 中。在 MVC 的 viewDidLoad 中我有
let controllers = self.splitViewController!.viewControllers
self.detailViewController = controllers[controllers.count-1].topViewController as DetailViewController},
但是当我尝试 self.navigationController.pushView... 建议时,我收到以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
上线let controllers = ...
EDIT 到 Edit
即使解决了 found nil 问题,地图和 table 似乎也无法上传。有什么想法吗?
Segues 是故事板创作。如果您没有 Storyboard,则无法继续。如果您的 masterViewController
嵌入在 UINavigationController
中,则移动到 detailViewController
的编程方式是:
self.navigationController.pushViewController(detailViewController, animated: true)
如果您的 masterViewController
没有嵌入 UINavigationController
,那么您可以模态显示 detailViewController
:
self.presentViewController(detailViewController, animated: true, completion: nil)
更新:
在您更新的问题中,您提到了 SplitViewController
。
我最初的回答为您提供了 iPhone 的信息。对于 SplitViewController,Master 和 Detail 同时出现在屏幕上,因此不需要加载新的 ViewController(这是 segue 所做的)。只需将需要发送到 detailViewController
的数据写入 属性 或属性,然后调用一个方法让 detailViewController
刷新它的视图。您甚至可以在 detailViewController
.
didSet
自动执行此操作
请注意,当您更新 detailViewController
时,viewDidLoad
不会 运行。您需要提取更新 detailViewController
的 UI 的代码。将其命名为 updateUI
。然后从 viewDidLoad
和数据更新时调用 updateUI
。我建议在您的 customData 属性 上实施 didSet
并从那里调用 updateUI
。