如何在 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