如何使用通知和访问 userInfo?

Posted

技术标签:

【中文标题】如何使用通知和访问 userInfo?【英文标题】:How to use notification and accessing userInfo? 【发布时间】:2018-07-23 04:56:42 【问题描述】:

我正在使用 Swift 开发一个生命游戏项目。我需要通过NotificationCenter 将网格传递给View Controller。我传递的信息如下:

let nc = NotificationCenter.default
let info = ["grid": self.grid]
nc.post(name: EngineNoticationName, object: nil, userInfo:info)

我在ViewController 中收到Notification。当我打印出 userInfo 时:

let grid = notified.userInfo?["grid"]
print("\(grid!)")

我明白了(它适用于 10x10 网格,但我相信这足以解决我的问题):

Grid(_cells: [[Assignment4.Cell(position: (row: 0, col: 0), state: Assignment4.CellState.empty),Assignment4.Cell(位置:(行:0,列: 1)、状态:Assignment4.CellState.empty)、Assignment4.Cell(位置: (行:0,列:2),状态:Assignment4.CellState.empty), Assignment4.Cell(位置:(行:0,列:3),状态: Assignment4.CellState.empty),Assignment4.Cell(位置:(行:0,列: 4)、状态:Assignment4.CellState.empty)、Assignment4.Cell(位置: (行:0,列:5),状态:Assignment4.CellState.empty), Assignment4.Cell(位置:(行:0,列:6),状态: Assignment4.CellState.empty),

如何访问该对象的状态?

谢谢。

【问题讨论】:

notified.userInfo?["grid"] 转换为self.grid 类型。 【参考方案1】:

在您的通知处理函数中,您需要将接收到的数据转换为:

func handleGridNotification(_ notification: Notification) 
    if let grid = notification.userInfo["grid"] as? Grid 
        print(grid.cells[0][0].state)
    

上面的代码应该会产生结果:Assignment4.CellState.empty

我还想在您的代码中遵守两点:

    数组中的单元格不应该知道它的索引。考虑离开网格来处理单元格索引的变化,或者换句话说你不需要这个:position: (row: 0, col: 1) 为了更方便地访问您的自定义对象 Grid,您可以创建下标方法,其中包含与单元格数组匹配的 2 个参数。例如:grid[x][y] 可以转换为 grid.cells[x][y] ,这样单元格就可以变成 private 字段。您可以在此here 上阅读更多信息。

【讨论】:

这让我得到了答案。我必须使用 if let engine = notify.userInfo?["grid"] as? StandardEngine Grid 是 StandardEngine 的一个属性,其中包含您上面描述的下标方法。非常感谢所有的帮助!【参考方案2】:

按照杰克的建议,将其转换为网格类型:

guard let grid = notified.userInfo?["grid"] as? gridType else return
//print(grid[0].state)

【讨论】:

以上是关于如何使用通知和访问 userInfo?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nimble 测试通知的 userInfo 部分?

如何从 Apple 推送通知中获取 userInfo

调用中的额外参数 userinfo

如何将目标 C 推送通知代码转换为 Swift

检索 UserInfo 的访问令牌

SWIFT - 从 userInfo 获取值以填充推送通知的字段