Ios 重用故事板序列中涉及的细节UIViewController
我有一个在iPad上运行的master/detail应用程序。在横向模式下,两个视图并排显示。右/局部视图控制器包含一个Ios 重用故事板序列中涉及的细节UIViewController,ios,iphone,uiviewcontroller,Ios,Iphone,Uiviewcontroller,我有一个在iPad上运行的master/detail应用程序。在横向模式下,两个视图并排显示。右/局部视图控制器包含一个MKMapView 问题在于,当在左/主视图控制器中选择不同的表格单元并基本上重新执行该序列时,整个局部视图控制器将重新实例化 这意味着我使用的MKMapView会丢失用户的位置,基本上从零开始,从国家比例放大到街道比例 在执行segue之前,是否有方法确定正在显示的详细视图是否已经是我想要的视图,并向其提供新数据并告诉其刷新 例如: override func tableVi
MKMapView
问题在于,当在左/主视图控制器中选择不同的表格单元并基本上重新执行该序列时,整个局部视图控制器将重新实例化
这意味着我使用的MKMapView
会丢失用户的位置,基本上从零开始,从国家比例放大到街道比例
在执行segue之前,是否有方法确定正在显示的详细视图是否已经是我想要的视图,并向其提供新数据并告诉其刷新
例如:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
segueParkName = parkNames[indexPath.row]
self.performSegueWithIdentifier("showParkDetails", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showParkDetails" {
let controller = (segue.destinationViewController as UINavigationController).topViewController as ParkDetailsController
NSLog("Controller: \(controller)") // Different instance every time!
controller.parkName = segueParkName
}
}
我希望能够:
prepareForSegue
时,我可以得到一个重用的视图控制器,特别是(!)如果它已经显示出来的话didselectrowatinexpath
方法中,执行自定义序列并执行我自己的推送。但我真的很喜欢使用内置系统分段的想法,所以我不必具体说明我在推动什么以及在哪里。使用显示细节(如替换)
似乎比定义我自己的更不可知设备我认为,在你的第一个建议中,一旦你进入准备阶段,即使不是不可能放弃这个阶段,也会很麻烦。所以我同意你的第二个选择。但是,如果所需的详细视图控制器已经就位,则根本不需要触发序列。所以而不是
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
segueParkName = parkNames[indexPath.row]
self.performSegueWithIdentifier("showParkDetails", sender: self)
}
你可能有点像
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
segueParkName = parkNames[indexPath.row]
self.detailViewController.parkName = segueParkName
}
这假设您已经有一个属性detailViewController指向您的detailViewController。它还假设detailViewController始终是您需要的—如果需要,请检查detailViewController类以查看它是否是您想要的MKMapView。最后,如果设置parkName无法实现您需要的所有功能(例如设置更改动画),则只需在MkMapView中实现一个新方法,并调用该方法来代替设置parkName
编辑仅为了扩展,您可以使用:
if self.detailViewController.isKindOfClass(yourMKMapViewSubclass) {
self.detailViewController.parkName = segueParkName
}
测试detailViewController是否确实是您的MkMapView 您可以通过实现shouldPerformSegue来取消一个segue,但这适用于公园名称因某种原因无效的情况,以防止显示无效公园的视图控制器 在这种情况下,解决方案是使用对主控制器中的详图控制器的引用(内置主/详图模板为您提供)。然后在prepareForSegue中,从旧的细节控制器获取地图,并将其放在新的细节控制器上 随着应用程序变得越来越复杂,主应用程序可能不再适合维护对细节控制器的引用。例如,如果你制作了一个根控制器来推送一个新的主控器,那么当应用程序像模板应用程序一样处于纵向时,主控器将找不到细节。因此,在这种情况下,实现拆分控制器委托的类也可以维护主/细节的上下文(initWithPlitViewController)。通过为此类在init中的类别在splitViewController上设置owningContext参数self,您可以从需要的位置访问它。例如,从主屏幕上设置地图视图。并在详图的loadView中从中获取地图视图