UIButton调用方法时调用方法时,操场崩溃?

问题描述 投票:0回答:1

我希望我的应用程序在按下按钮时仅在控制台中打印文本。这是在从类中调用方法时发生的。它只能在一个操场上制作。它崩溃了,给了我:libc ++ abi.dylib:以类型为NSException的未捕获异常终止

非常有趣的事情:如果我在类之外使用该方法,该方法将不会崩溃。

导入UIKit导入PlaygroundSupport

class MyViewController:UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    var giac=giacomo()
    let view=UIView()
    view.backgroundColor = .white
    let button = UIButton()
    button.frame = CGRect(x:0,y:0, width:50, height: 50)
    button.tintColor = .red
    button.backgroundColor = .black
    button.setTitle("Test",for: .normal)

    button.addTarget(self, action: #selector(giac.action(_button:)), for: .touchUpInside)

    view.addSubview(button)
    self.view=view
}


class giacomo:NSObject
{ @objc func action(_button:UIButton)
     {

         print("CIAO")
     }

}

}PlaygroundPage.current.liveView = MyViewController()

swift crash swift-playground nsexception
1个回答
0
投票

您已经在addTarget函数中将目标参数指定为self。但是给定的选择器函数不在同一类中。因此目标应该是您的giac变量。对于选择器,您应该给ClassName.methodname,这里是giacomo.action(_button :)。还有一个问题是您在viewDidLoad函数内部创建了变量giac。因此,它的作用域将终止于函数本身内部,因此不会调用目标选择器。因此,giac变量应该是MyViewController的字段。更新后的代码将如下所示。

import UIKit
import PlaygroundSupport

class MyViewController: UIViewController {

    var giac=giacomo()

override func viewDidLoad() {
    super.viewDidLoad()

    let view=UIView()
    view.backgroundColor = .white
    let button = UIButton()
    button.frame = CGRect(x:0,y:0, width:50, height: 50)
    button.tintColor = .red
    button.backgroundColor = .black
    button.setTitle("Test",for: .normal)

    button.addTarget(giac, action: #selector(giacomo.action(_button:)), for: .touchUpInside)

    view.addSubview(button)
    self.view=view
}


class giacomo:NSObject
{ @objc func action(_button:UIButton)
     {

         print("CIAO")
     }

}
}

PlaygroundPage.current.liveView=MyViewController()

希望有帮助。如果您认为答案有帮助,请接受并认可答案。干杯。

© www.soinside.com 2019 - 2024. All rights reserved.