我有一个在iPad上运行的主/详细应用程序。在横向模式下,两个视图并排放置。右/详细视图控制器包含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时,我可以提供一个可重用的视图控制器,尤其是(!)(如果已经显示)。
  • didSelectRowAtIndexPath方法中,执行自定义segue并自己进行推送。但是我真的很喜欢使用内置系统序列的想法,因此我不必具体说明我要推送的内容和位置。使用Show Detail (eg. Replace)似乎比定义我自己的设备更了解设备。
  • 最佳答案

    我认为,在您的第一个建议中,一旦您准备好PreseForSegue,放弃该segue将会很麻烦。所以我会选择您的第二个选择。但是,如果所需的详细信息viewController已经存在,则根本不需要触发segue。所以,而不是

    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
    }
    

    假设您已经有一个指向您的详细信息ViewController的属性detailViewController。它还假定detailViewController将始终是您需要的那个-如有必要,请检查detailViewController类以查看它是否为所需的MKMapView。最后,如果设置parkName不能满足您的所有需求(例如,为更改添加动画效果),则只需在MkMapView中实现一个新方法,然后调用该方法代替设置parkName。

    编辑只需对此进行扩展,您可以使用:
    if self.detailViewController.isKindOfClass(yourMKMapViewSubclass) {
       self.detailViewController.parkName = segueParkName
    }
    

    测试detailViewController是否确实是您的MkMapView。

    关于ios - 重用 Storyboard 中涉及的细节UIViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26108309/

    10-12 00:18
    查看更多