• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 View Controller 之间传递对象

[复制链接]
菜鸟教程小白 发表于 2022-12-11 19:35:54 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

最近我一直在开发一个新应用程序,但我正在努力在 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap