最近我一直在开发一个新的应用程序,我很难在视图控制器之间传递数据。
我使用一个视图控制器,它包含一个容器视图,我在其中使用谷歌地图。有些人知道在谷歌地图上放置一个按钮是不可能的,因为它覆盖了一切(这就是为什么我把它作为容器视图)。现在我遇到了一个问题,我无法创建一个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将它们都作为容器保存。
答案 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)
}
}
}
请注意,上面的代码片段只是插图,您可以通过多种方式访问控制器,设置委派或阻止。