我在业余时间开发一款简单的游戏,它有两个视图控制器:默认的ViewController和GameViewController。我进行了设置,使GameViewController是ViewController中UIView的子视图,这样做是为了自定义主菜单和实际游戏之间的过渡(我希望将来找到一些更有效的方法来实现此目的) !)
我目前遇到的问题是,我在GameViewController类中声明的选择器不会调用GameViewController类中的函数,但是选择器确实可以在ViewController类中调用函数。例如,这是我的ViewController类和GameViewController类中的一些代码:
class ViewController: UIViewController {
@objc func myFunc() {
print("Some output to show that the ViewController function is working")
}
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myButton = UIButton()
myButton.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
myButton.backgroundColor = .green
// This works fine. The function in ViewController is called, and I get some output in the console
myButton.addTarget(self, action: #selector(ViewController.myFunc), for:.touchUpInside)
// This does NOT work. No output is shown, therefore the function in GameViewController never got called
myButton.addTarget(self, action: #selector(self.myFunc2), for:.touchUpInside)
view.addSubview(myButton)
}
@objc func myFunc2() {
print("Some different output to show that the GameViewController function is working")
}
}
为了防止按钮出现问题,我还尝试使用通知来调用我的函数。由于我知道ViewController中的函数正在运行,因此我发布了该函数的通知,并将观察者添加到我的GameViewController中:
class ViewController: UIViewController {
@objc func myFunc() {
print("Some output to show that the ViewController function is working")
NotificationCenter.default.post(name: .myNotification, object: nil)
}
}
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myButton = UIButton()
myButton.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
myButton.backgroundColor = .green
myButton.addTarget(self, action: #selector(ViewController.myFunc), for:.touchUpInside)
view.addSubview(myButton)
NotificationCenter.default.addObserver(self, selector: #selector(self.myFunc2(notification:)), name: .myNotification, object: nil)
}
@objc func myFunc2(notification: NSNotification) {
print("Some different output to show that the GameViewController function is working")
}
}
extension Notification.Name {
static let myNotification = Notification.Name("myNotification")
}
甚至使用Notifications,该函数在ViewController中被调用,通知被(据说)被发布,并且 still 我的GameViewController函数从未被调用。
我已经使用断点来确保在通知发布之前先 被100%调用我的观察者,并且我已经在GameViewController的viewDidLoad中调用了myFunc2并获得了输出,所以我真的可以不明白为什么我遇到这么多麻烦。
任何见解都会有所帮助,谢谢!
答案 0 :(得分:0)
好吧,我成功了。
事实证明,老实说,我不是100%肯定这是完全正确的,因为我使用的是便利初始化(在OP中我忘了提及),“ self”最终指向当前实例的ViewController,因此当我尝试调用“ self.myFunc2”时,实际上是在尝试调用“ ViewController.myFunc2”,这显然不存在。
对于我为什么在尝试调用不存在的函数时它没有完全崩溃是没有意义的,而且我并没有真正理解为什么“ self”没有按预期工作的原因,但是我想那是结案。