OGeek|极客世界-中国程序员成长平台

标题: ios - 在 View Controller 之间传递对象 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 19:35
标题: ios - 在 View Controller 之间传递对象

最近我一直在开发一个新应用程序,但我正在努力在 View Controller 之间传递数据。

我使用一个 View Controller ,它包含一个容器 View ,我在其中使用谷歌地图。正如你们中的一些人所知,在谷歌地图上放置一个按钮是不可能的,因为它覆盖了所有内容(这就是我将它作为容器 View 的原因)。现在我遇到了一个问题,我无法制作一个可以performSegue 的操作按钮,而且我也未能通过NotificationCenter 传递一个对象。我制作了一个名为 Song 的模型,我想将歌曲 List 传递给其他 Controller (表格 View )。

class Song {
var sid: String
var songName: String
var artistId: String
var length: String
var songImage: String?
var album: String
var lastUpdateate?
}

对于在 VC 之间移动此列表有何想法或建议? 但是,这些 View 之间没有真正的联系,mainVC 将它们都作为容器保存。



Best Answer-推荐答案


所以你的 MainController 拥有两个必须交换数据的 Controller ?方法是使用 Delegate 模式并设置 Controller 之间的弱关系:

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
       }
   }
}

另一种选择:通过 block 建立连接。这是一种更现代、更快捷的方式:

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)
       }
   }
}

请注意,上面的代码片段只是说明,您有很多方法可以访问 Controller 、设置委托(delegate)或 block 。

关于ios - 在 View Controller 之间传递对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48227890/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4