在视图控制器之间传递对象

时间:2018-01-12 14:05:36

标签: ios swift uitableview uiviewcontroller uicontainerview

最近我一直在开发一个新的应用程序,我很难在视图控制器之间传递数据。

我使用一个视图控制器,它包含一个容器视图,我在其中使用谷歌地图。有些人知道在谷歌地图上放置一个按钮是不可能的,因为它覆盖了一切(这就是为什么我把它作为容器视图)。现在我遇到了一个问题,我无法创建一个performSegue的动作按钮,而且我也无法通过NotificationCenter传递对象。我创建了一个名为Song的模型,我想将一首歌List传递给其他控制器(一个表视图)。

  课堂歌曲{
      var sid:String
      var songName:String
      var artistId:String
      var length:String
      var songImage:String?
      var album:String
      var lastUpdate:日期?
}

在VC之间移动此列表的任何想法或建议? 然而,这些视图之间没有真正的联系,mainVC将它们都作为容器保存。

1 个答案:

答案 0 :(得分:0)

所以你有MainController拥有两个必须交换数据的控制器?在途中是使用委托模式并在您的控制器之间设置弱关系:

protocol SongSelectable {
    func songSelected(_ song: Song) 
}

class PlaylistController: UIViewController {
    weak var songSelectable: SongSelectable?
}

class MapController: UIViewController, SongSelectable {
    func songSelected(_ song: Song)  {
        //do your code
    }
}

class MainController: UIViewController {
   weak var mapController: MapController?
   weak var playlistController: PlaylistController?
   func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       // You can't guaranty order here, so some duplication required
       if let controller = segue as? MapController {
           mapController = controller
           playlistController?.songSelectable = controller

       }
       else if let controller = segue as? PlaylistController {
           playlistController = controller 
           controller.songSelectable = mapController
       }
   }
}

另一种选择:通过块建立连接。它更现代,更Swifty方式:

typealias SongHandler = (Song)->()

class PlaylistController: UIViewController {
    var songHandler = SongHandler?
}

class MapController: UIViewController {
    func songSelected(_ song: Song)  {
        //do your code
    }
}

class MainController: UIViewController {
   weak var mapController: MapController?

   func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       if let controller = segue as? MapController {
           mapController = controller
       }
       else if let controller = segue as? PlaylistController {
           controller.songHandler = { [unowned self] (song) in self.mapController?.songSelected(song)
       }
   }
}

请注意,上面的代码片段只是插图,您可以通过多种方式访问​​控制器,设置委派或阻止。