具有optinal闭合的Swift选择器功能

时间:2017-12-05 22:48:17

标签: swift selector nsnotificationcenter

添加通知观察者时,#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()
}

1 个答案:

答案 0 :(得分:0)

通知选择器方法中的完成处理程序是无意义的(并且是非法的)。你期望的是对象应该是完成处理程序的接收者......?

通知选择器的语法与目标/操作选择器非常相似。传递的参数必须是受影响对象的类型(此处为Notification)。

func reloadData(_ notification : Notification) { ...

替代方案是Notification的基于块的API,它能够捕获封闭函数/方法的值。

在具有指定选择器的通知对象中传递自定义数据的唯一方法是(可选)userInfo字典。