首页 > 解决方案 > 当需要 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' 方法、属性或初始化程序”

标签: swiftselectorself

解决方案


#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)


推荐阅读