ios - 在制作自定义 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
解决方案
该应用程序正在崩溃,因为在下面的行中您已将目标设置为self
在customButton
课堂上
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")
}
}
推荐阅读
- android - android通过bundle将数据从片段传递到适配器
- exception - Google 电子表格:updateChart 失败异常
- java - 自定义签名者正在签名什么?
- html - 带条件的 Excel 导出 maatwebsite
- linux - 在 Redhat Linux 中执行 top 命令时如何显示进程路径?
- x11 - 如何设置 VcXSrv 以与 WSL2 一起使用
- python - Dataframe.loc 不适用于多个索引,非常简单
- button - 有没有办法让按钮在第一次单击时更改一种颜色,然后在第二次单击时恢复为原始颜色?
- eclipse - 无法将服务器添加到 Eclipse Photon
- html - 如何制作一个显示等于flex时全显示?