Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重用故事板序列中涉及的细节UIViewController_Ios_Iphone_Uiviewcontroller - Fatal编程技术网

Ios 重用故事板序列中涉及的细节UIViewController

Ios 重用故事板序列中涉及的细节UIViewController,ios,iphone,uiviewcontroller,Ios,Iphone,Uiviewcontroller,我有一个在iPad上运行的master/detail应用程序。在横向模式下,两个视图并排显示。右/局部视图控制器包含一个MKMapView 问题在于,当在左/主视图控制器中选择不同的表格单元并基本上重新执行该序列时,整个局部视图控制器将重新实例化 这意味着我使用的MKMapView会丢失用户的位置,基本上从零开始,从国家比例放大到街道比例 在执行segue之前,是否有方法确定正在显示的详细视图是否已经是我想要的视图,并向其提供新数据并告诉其刷新 例如: override func tableVi

我有一个在iPad上运行的master/detail应用程序。在横向模式下,两个视图并排显示。右/局部视图控制器包含一个
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
    }
}
我希望能够:

  • 不知何故,告诉iOS,当到达
    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中从中获取地图视图