草庐IT

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

coder 2023-09-13 原文

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

我在 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/

有关ios - 在制作自定义 UIButton 时以 NSException 类型的未捕获异常终止的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  7. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  8. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  9. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐