我有一个在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
}
}
我将像一样:
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/