首页 > 解决方案 > 在制作自定义 UIButton 时以 NSException 类型的未捕获异常终止

问题描述

我想制作一个自定义按钮并在自定义按钮类内的选择器内提供输入,但它给了我一个错误消息。我该如何解决

我在操场上测试它,因为当我运行模拟器时,应用程序崩溃了。这是操场上出现的错误

以 NSException 类型的未捕获异常终止

这是我在操场上的代码

class customButton: UIButton {

let titleName: String
let selectorName: String

init(titleName: String, selectorName: String) {
    self.titleName = titleName
    self.selectorName = selectorName
    super.init(frame: .zero)

    self.setTitle(titleName, for: .normal)
    self.addTarget(self, action: Selector(selectorName), for: .touchUpInside)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

class viewController: UIViewController {

override func loadView() {
    super.loadView()

    let testButton = customButton(titleName: "Test", selectorName: "handleButton")
    testButton.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(testButton)
    testButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    testButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}

func handleButton() {
    print("Pressed")
  }
}

新问题是

无法转换 (viewController) -> () 预期参数类型 UIViewController 的值类型

I make a custom UIButton with target selector as an input, when I try to add input in the custom button it show in Xcode

无法将类型“(ProfileController)->()->(ProfileController)”的值转换为预期的参数类型“UIViewController”

这是我在 ProfileController 和自定义按钮中的代码

class CustomButton: UIButton {

let imageName: UIImage
let selectorName: String
let target: UIViewController

init(imageName: UIImage, selectorName: String, target: UIViewController) {
    self.imageName = imageName
    self.selectorName = selectorName
    self.target = target
    super.init(frame: .zero)

    self.setImage(imageName.withRenderingMode(.alwaysOriginal), for: .normal)
    self.addTarget(target, action: Selector(selectorName), for: .touchUpInside)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

class ProfileController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

let profileID = "profileID"

let profileImageView: UIImageView = {
    let iv = UIImageView()
    iv.image = #imageLiteral(resourceName: "581010.jpg-r_1280_720-f_jpg-q_x-xxyxx").withRenderingMode(.alwaysOriginal)
    iv.contentMode = .scaleAspectFill
    iv.clipsToBounds = true
    return iv
}()

let pickerImage = CustomButton(imageName: #imageLiteral(resourceName: "user-6"), selectorName: "handleImagePicker", target: self) //this is the error message show up in the target: self

标签: iosswiftexceptionuibutton

解决方案


该应用程序正在崩溃,因为在下面的行中您已将目标设置为selfcustomButton课堂上

self.addTarget(self, action: Selector(selectorName), for: .touchUpInside)

customButton类没有方法handleButton

handleButton在视图控制器中,因此您必须将目标设置为视图控制器

所以你必须对你的代码进行轻微的修改,如下所示

class customButton: UIButton {

let titleName: String
let selectorName: String
let ViewController:UIViewController

init(titleName: String, selectorName: String,ViewController:UIViewController) {
self.titleName = titleName
self.selectorName = selectorName
self.ViewController = ViewController
super.init(frame: .zero)

self.setTitle(titleName, for: .normal)
self.addTarget(ViewController, action: Selector(selectorName), for: .touchUpInside)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

class viewController: UIViewController {

override func loadView() {
super.loadView()

let testButton = customButton(titleName: "Test", selectorName: "handleButton",ViewController:self)
testButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(testButton)
testButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
testButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}

func handleButton() {
print("Pressed")
 }
}

推荐阅读