如何使用通知和访问 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?的主要内容,如果未能解决你的问题,请参考以下文章