swift - 当需要 self 参数时,如何使用#selector 调用另一个类中的函数?
问题描述
我似乎无法从每个类中删除本地类函数,因为我不知道如何使用#selector 调用另一个类中的函数(当 Self 是必需参数时)。
目前我调用了一个本地函数,它调用得很好:
class Tickets: UIViewController {
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector: #selector(setDataIcon), name: NSNotification.Name(rawValue: "ActiveSyncRequestInitiated"), object: nil)
}
@objc func setDataIcon() {
global.setDataIcon(self) // called via #selector above, works
}
}
我宁愿删除本地函数 setDataIcon 并通过选择器调用
#selector(global.setDataIcon(self)) // doesn't compile!
但我收到错误“'#selector' 的参数不引用 '@objc' 方法、属性或初始化程序”
解决方案
#selector 字只能调用标有@objc 的方法。如果您删除该方法或 @objc 限定符,#selector 将无法调用它。这就是你收到错误的原因。
如果您希望在 A 类中观察到通知以执行 B 类中的代码,我看到了几个选项;
1.) 在 A 类中创建 B 类的实例,并让 A 类方法中的 setDataIcon 中的代码从 B 类的实例调用该函数。
2.) 在 setDataIcon 中,发布 B 类观察到的通知,然后注册 B 类以观察该通知并让 B 类在观察时执行代码。
3.) 使用委托方法。确保在注册观察通知之前,创建 B 类的实例并将其分配给 A 类的委托。然后,在 setDataIcon 中,让委托(即 B 类)调用委托方法。
查看您的评论,如果“global”是 A 类中 B 类的实例,则 global 中的 setDataIcon 方法也需要使用 @objc 进行限定。(选项1)
推荐阅读
- r - R中geometrycollection中的联合多边形
- wordpress - 跨浏览器的下拉菜单样式问题
- python - ParseError:文档元素后的垃圾:第 7 行,第 0 列,(Python,XML 解析)
- c# - 使用 C# 计算复合年增长率 (CAGR)
- c# - C# 实体框架 fromsqlraw 查询,包含 (in) 而不是 where 子句
- go - 使用neo4j驱动时使用match语句,返回result.record为nil
- reactjs - 如何使用material-ui组件
- c++ - 在纹理图像上渲染四边形模型
- java - 比特币 Java RPC 客户端 - 无法创建原始交易
- c++ - 如何使用 PIMPL 方法从原始类访问 impl 类的私有成员