gpt4 book ai didi

ios - 在制作自定义 UIButton 时以 NSException 类型的未捕获异常终止

转载 作者:可可西里 更新时间:2023-11-01 00:54:19 31 4
gpt4 key购买 nike

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

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

terminating with uncaught exception of type NSException

这是我在 Playground 上的代码

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")
}
}

新问题是

Cannot convert a value type of (viewController) -> () expected argument type 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

Cannot convert value of type '(ProfileController) -> () -> (ProfileController)' to expected argument type '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

最佳答案

您应该删除选择器作为初始化参数。您应该在创建按钮的任何位置设置目标。您还需要为 handleButton 添加 @objc,以供 Selector 调用。您的设置将如下所示,

class customButton: UIButton {

let titleName: String

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

self.setTitle(titleName, for: .normal)
}

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")
testButton.translatesAutoresizingMaskIntoConstraints = false
testButton.addTarget(self, action: Selector("handleButton"), for: .touchUpInside)
view.addSubview(testButton)
testButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
testButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}

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

在最新的 Swift 中,您应该将 Selector("handleButton") 更改为 #selector(handleButton)


如果你想坚持当前的实现,那么你需要在 customButton 初始化器中使用 target 参数,如下所示,

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

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

现在您将像这样传递 ViewController 引用,

let testButton = customButton(titleName: "Test", selectorName: "handleButton", target: self)

并且不要忘记使用 objchandleButton 标记为,

@objc func handleButton() {

关于ios - 在制作自定义 UIButton 时以 NSException 类型的未捕获异常终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53927914/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com