添加通知观察者时,#selector
作业的错误是什么?
NotificationCenter.default.addObserver(self, selector: #selector(reloadData), name: NSNotification.Name(rawValue: "reloadCollectionData"), object: nil)
func reloadData(completionHandler: ((Bool) -> Void)? = nil ) {
mainCollectionView.reloadData()
completionHandler?(true)
}
每当我发布通知时,应用程序都会崩溃
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "reloadCollectionData"), object: nil)
我已经尝试了#selector(reloadData(completionHandler: nil)
修改
我已经尝试了选择器#selector(reloadData(completionHandler:))
,但它仍然在我发布通知的行中错误消息Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)
崩溃。
当我按如下方式更改代码时,一切正常,但创建函数只是为了调用另一个函数并不是很好
NotificationCenter.default.addObserver(self, selector: #selector(testCall), name: NSNotification.Name(rawValue: "reloadCollectionData"), object: nil)
func testCall() {
self.reloadData()
}
答案 0 :(得分:0)
通知选择器方法中的完成处理程序是无意义的(并且是非法的)。你期望的是对象应该是完成处理程序的接收者......?
通知选择器的语法与目标/操作选择器非常相似。传递的参数必须是受影响对象的类型(此处为Notification
)。
func reloadData(_ notification : Notification) { ...
替代方案是Notification
的基于块的API,它能够捕获封闭函数/方法的值。
在具有指定选择器的通知对象中传递自定义数据的唯一方法是(可选)userInfo
字典。