Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 当需要self参数时,如何使用#selector调用另一个类中的函数?_Swift_Selector_Self - Fatal编程技术网

Swift 当需要self参数时,如何使用#selector调用另一个类中的函数?

Swift 当需要self参数时,如何使用#selector调用另一个类中的函数?,swift,selector,self,Swift,Selector,Self,我似乎无法从每个类中删除本地类函数,因为我不知道如何使用#选择器调用另一个类中的函数(当Self是必需参数时) 目前,我调用了一个本地函数,该函数调用得非常好: class Tickets: UIViewController { override func viewWillAppear(_ animated: Bool) { NotificationCenter.default.addObserver(self, selector: #selector(setData

我似乎无法从每个类中删除本地类函数,因为我不知道如何使用#选择器调用另一个类中的函数(当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”的“I get error”参数没有引用“@objc”方法、属性或初始值设定项“

选择器单词只能调用标记为@objc的方法。如果删除该方法或@objc限定符,#选择器将无法调用它。这就是为什么你会出错

如果您希望在类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)

那么,global是另一类吗?我们能看到什么是全球性的吗?另外-您说要“删除本地函数
setDataIcon
并调用选择器”-您想在哪里调用它?您是否正在尝试执行类似于
lambda/closure
?我希望我的addObserver调用看起来像:NotificationCenter.default.addObserver(self,selector:#selector(global.setDataIcon(self)),name:NSNotification.name(rawValue:“ActiveSyncRequestInitiated”),object:nil)至于我的全局类函数的内容,它引用了source:source.navigationItem.rightBarButtonItem=dataIconItem//其中source是调用它的UIViewController——选择器中我遇到问题的“self”。这本质上是您的问题。基本上,你目前的答案是解决这个问题最正确的方法。