按钮中未捕获的异常

时间:2018-01-05 19:14:10

标签: ios swift

我有一个uiview,其中有几个元素用于我的应用中的评论功能。有一个文本字段,按钮和行分隔符。一切都很好,但是当我点击提交应用程序崩溃时,我收到此错误。

'NSInvalidArgumentException', reason: '-[UIButton copyWithZone:]: unrecognized selector sent to instance 0x7fe58c459620'

我没有看到我的实现有什么问题,所以这个错误对我来说有点混乱。这是我的UIView的课程

import UIKit
protocol CommentInputAccessoryViewDelegate {
    func handleSubmit(for comment: String?)
}

class CommentInputAccessoryView: UIView, UITextFieldDelegate {
    var delegate: CommentInputAccessoryViewDelegate?
    /*
    // Only override draw() if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func draw(_ rect: CGRect) {
        // Drawing code
    }
    */

   fileprivate let submitButton: UIButton = {
        let submitButton = UIButton(type: .system)
        submitButton.setTitle("Submit", for: .normal)
        submitButton.setTitleColor(.black, for: .normal)
        submitButton.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
        submitButton.addTarget(self, action: #selector(handleSubmit), for: .touchUpInside)
        //submitButton.isEnabled = false
        return submitButton
    }()

    lazy var commentTextField: UITextField = {
        let textField = UITextField()
        textField.placeholder = "Add a comment"
        textField.delegate = self
        textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
        return textField
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
       // backgroundColor = .red

        addSubview(submitButton)
        submitButton.anchor(top: topAnchor, left: nil, bottom: bottomAnchor, right:rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 12, width: 50, height: 0)
        addSubview(commentTextField)
        commentTextField.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: submitButton.leftAnchor, paddingTop: 0, paddingLeft: 12, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
        setupLineSeparatorView()

    }
    fileprivate func setupLineSeparatorView(){
        let lineSeparatorView = UIView()
        lineSeparatorView.backgroundColor = UIColor.rgb(red: 230, green: 230, blue: 230)
        addSubview(lineSeparatorView)
        lineSeparatorView.anchor(top:topAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0.5)
    }

    @objc func handleSubmit(for comment: String?){
        guard let commentText = commentTextField.text else{
            return
        }
        delegate?.handleSubmit(for: commentText)
    }

    @objc func textFieldDidChange(_ textField: UITextField) {
        let isCommentValid = commentTextField.text?.count ?? 0 > 0
        if isCommentValid {
            submitButton.isEnabled = true
        }else{
            submitButton.isEnabled = false
        }
    }
    func clearCommentTextField(){
        commentTextField.text = nil
    }

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


}

这是最终通过协议方法处理提交的附带类

    //allows you to gain access to the input accessory view that each view controller has for inputting text
    lazy var containerView: CommentInputAccessoryView = {
        let frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 50)
        let commentInputAccessoryView = CommentInputAccessoryView(frame:frame)
        commentInputAccessoryView.delegate = self
        return commentInputAccessoryView

    }()


    @objc func handleSubmit(for comment: String?){
        guard let comment = comment, comment.count > 0 else{
            return
        }

        let userText = Comments(content: comment, uid: User.current.uid, profilePic: User.current.profilePic!,eventKey: eventKey)
        sendMessage(userText)
        // will clear the comment text field
        self.containerView.clearCommentTextField()
    }

extension NewCommentsViewController {
    func sendMessage(_ message: Comments) {
        ChatService.sendMessage(message, eventKey: eventKey)

    }
}

2 个答案:

答案 0 :(得分:1)

目标/操作#selector(handleSubmit)的关联方法必须是

@objc func handleSubmit(_ sender: UIButton) { ...

@objc func handleSubmit() { ...

不支持其他表格。

代码是否完全编译?
实际上,您无法在初始化程序self

中使用let submitButton: UIButton = { .. }()

答案 1 :(得分:0)

问题似乎是UIButton没有copyWithZone方法,你不能为UIButtons定义委托:

what are the delegate methods available with uibutton