如何在Master和Detail视图之间没有* storyboard *?

时间:2015-06-23 15:21:31

标签: swift segue master-detail programmatically-created

我已经完全以编程方式创建了一个Master-Detail项目,也就是说没有任何故事板(我删除了文件)。

我无法弄清楚如何在主视图(MV)和详细视图(DV)之间进行划分

我试过

self.showViewController(detailViewController, sender: self)

self.showDetailViewController(detailViewController, sender: self)
来自MV的

,但它确实不起作用。

我的MV表中填充了单元格,按下这些单元格时,应该缩放到DV中mapView的注释。

出于某种原因,DV上的地图和MV中的表在应用程序打开后第一次加载后不会刷新。

我正在使用自定义对象在视图之间传递数据

MV:

    detailViewController.setRequired(self.customObject)

    self.showDetailViewController(detailViewController, sender: self)

    self.tableView.reloadData()

其中“setRequired”是一个将DV的类变量设置为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不会更新,而且表格也不会更新。

有什么想法吗?

(提醒,当然有没有故事板文件)

提前致谢!

Jona的

修改

按照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 = ...

编辑到编辑

即使在找到找到的nil问题之后,地图和表格似乎也没有上传。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

Segues是一个故事板创建。如果您没有故事板,则无法进行。如果masterViewController嵌入了UINavigationController,则转移到detailViewController的编程方式是:

self.navigationController.pushViewController(detailViewController, animated: true)

如果您的masterViewController未嵌入UINavigationController,那么您可以模拟地展示detailViewController

self.presentViewController(detailViewController, animated: true, completion: nil)

<强>更新

在您更新的问题中,您提到了SplitViewController。 我的初步答案为您提供了iPhone的信息。对于SplitViewController,Master和Detail都同时在屏幕上,因此不需要加载新的ViewControllers(这就是segue所做的)。只需将需要发送到detailViewController的数据写入属性,然后调用方法让detailViewController刷新它的视图。您甚至可以使用didSet中的detailViewController上的viewDidLoad自动执行此操作。

注意,更新detailViewController时,detailViewController将无法运行。您需要提取更新updateUI的UI的代码。称之为updateUI。然后从viewDidLoad和您的数据更新时调用didSet。我建议您在customData属性上实施updateUI,然后从那里调用case class