我已经完全以编程方式创建了一个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问题之后,地图和表格似乎也没有上传。有什么想法吗?
答案 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
。