2014-09-29 63 views
1

我有一个在iPad上运行的主/细节应用程序。在横向模式下,我将两个视图并排放在一起。 权限/详细信息视图控制器包含MKMapView重复使用故事板中涉及的细节UIViewController

问题是,当在视图控制器中选择一个不同的表格单元格并且基本上重新执行该segue时,整个详细视图控制器被重新实例化。

这意味着我使用的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 
    } 
} 

我会像要么:

  1. 不知怎的告诉iOS设备通过达到prepareForSegue的时候,我可以接受所提供重用的视图控制器,特别是(!)是否已经显示。

  2. didSelectRowAtIndexPath方法,执行一个自定义的继续,并做我自己的推动。但我真的很喜欢使用内置系统的想法,所以我不必具体说明我在推什么,在哪里。使用Show Detail (eg. Replace)比定义我自己的设备更加不可知。

回答

1

我想,在你的第一个建议,这将是麻烦的,如果不是不可能放弃SEGUE一旦你在prepareForSegue。所以我会选择第二个选项。但是,如果您需要的详细视图控制器已经就位,则根本不需要触发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 
} 

这是假设你已经指向您的详细视图控制器属性detailViewController。它还假设detailViewController将始终是您需要的一个 - 如有必要,请检查detailViewController类以查看它是否是您想要的MKMapView。最后,如果设置parkName没有达到你需要的所有东西(例如动画改变),那么只需在你的MkMapView中实现一个新方法,然后调用它来代替设置parkName。

编辑只是为了就此展开,你可以使用:

if self.detailViewController.isKindOfClass(yourMKMapViewSubclass) { 
    self.detailViewController.parkName = segueParkName 
} 

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