ios - 重用 Storyboard segue 中涉及的细节 UIViewController

标签 ios iphone uiviewcontroller

我有一个在 iPad 上运行的主/从应用程序。在横向模式下,我将两个 View 并排放置。 right/detail View Controller 包含一个 MKMapView

问题是,当在left/master View Controller 中选择不同的表格单元格,并且基本上重新执行 segue 时,整个详细 View Controller 将被重新实例化。

这意味着我使用的 MKMapView 失去了用户的位置,基本上从头开始,从国家比例放大到街道比例。

有没有办法在执行 segue 之前确定正在显示的详细 View 是否已经是我想要的,并简单地向它提供新数据并告诉它刷新?

例如:

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 时,我可以接受提供一个重用 View Controller ,尤其是 (!) 如果它已经显示。

  2. didSelectRowAtIndexPath 方法中,执行自定义 segue 并进行我自己的推送。但我真的很喜欢使用内置系统 segues 的想法,所以我不必具体说明我要推送什么以及推送到哪里。使用 Show Detail (eg. Replace) 似乎比定义我自己的更独立于设备。

最佳答案

我认为,在您的第一个建议中,一旦您进入 prepareForSegue,即使不是不可能放弃 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
}

这假设您已经有一个属性 detailViewController 指向您的细节 ViewController。它还假定 detailViewController 将始终是您需要的那个 - 如有必要,请检查 detailViewController 类以查看它是否是您想要的 MKMapView。最后,如果设置 parkName 没有实现您需要的一切(例如动画更改),那么只需在 MkMapView 中实现一个新方法并调用它来代替设置 parkName。

编辑 只是为了对此进行扩展,您可以使用:

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

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

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

相关文章:

ios - UIViewController 中的静态表

iphone - 全双工在线音频 session

iphone - 使用 'presentModalViewController'加载 View

ios - 关闭模态呈现的 ViewController 总是让我回到根目录

ios - 图像未从 objective-c 中的 sql 数据库中检索

ios - 如何让按钮阴影与 Swift 4.2 一起使用?

iOS - 从系统设置运行应用深层链接

iphone - 对 NSMutableArray 进行排序?

iphone - 如何像在 Messages.app 中一样向下移动 iPhone 键盘?

iphone - 在父 ViewController 中获取当前 ViewController 名称