2014-09-29 62 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。