Ошибка расширения текстового поля - нераспознанный селектор отправлен в экземпляр swift - PullRequest
2 голосов
/ 22 марта 2020

Я сделал UITextField extension для ящика return button, чтобы я мог повторно использовать его для всех клавиатур, у которых нет кнопки возврата (например, цифровой клавиатуры).

Что я хочу: Я могу настроить действие кнопки возврата на resignFirstResponder() или becomeFirstResponder(), если textfield находится в конце или в середине другого textfield. В этом случае я бы хотел, чтобы он был becomeFirstResponder(), когда пользователь нажимает return на firstNameTextField. (примечание: мой textfield IBOutlet в порядке)

Что я получаю: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITextField phoneNumberShouldReturnWithSender:]: unrecognized selector sent to instance 0x7f8d07f2b6d0'

Расширение

import Foundation
import UIKit

extension UITextField {
    func addReturnButtonOnKeyboard(myAction: Selector?) {
        let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
        doneToolbar.barStyle = .default

        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let next: UIBarButtonItem = UIBarButtonItem(title: "Return", style: .done, target: self, action: myAction)

        let items = [flexSpace, next]
        doneToolbar.items = items
        doneToolbar.sizeToFit()

        self.inputAccessoryView = doneToolbar
    }
}

ViewController

import UIKit
import Alamofire
import IQKeyboardManagerSwift

class NewUserViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var usernameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var comfirmPasswordTextField: UITextField!
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var phoneNumberTextField: UITextField!
    @IBOutlet weak var firstNameTextField: UITextField!
    @IBOutlet weak var lastNamePasswordTextField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        self.hideKeyboardWhenTappedAround()
        usernameTextField.delegate = self
        passwordTextField.delegate = self
        comfirmPasswordTextField.delegate = self
        emailTextField.delegate = self
        phoneNumberTextField.delegate = self
        firstNameTextField.delegate = self
        lastNamePasswordTextField.delegate = self
        phoneNumberTextField.addReturnButtonOnKeyboard(myAction: #selector(phoneNumberShouldReturn(sender:)))
        IQKeyboardManager.shared.enableAutoToolbar = false
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if let nextResponder = textField.superview?.viewWithTag(textField.tag + 1) {
            nextResponder.becomeFirstResponder()
        } else {
            textField.resignFirstResponder()
        }

        return false
    }

    @objc func phoneNumberShouldReturn(sender: UITextField) {
        firstNameTextField.becomeFirstResponder()
    }    
}

Спасибо !!

1 Ответ

2 голосов
/ 22 марта 2020

Вы указали цель в расширении, поэтому действие отправляется в текстовое поле, а не на контроллер, вместо этого используйте следующее:

1) добавьте цель к интерфейсу

...
func addReturnButtonOnKeyboard(target: Any?, myAction: Selector?) {
    let doneToolbar: UIToolbar = UIToolbar(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50))
    doneToolbar.barStyle = .default

    let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, 
          target: nil, action: nil)
    let next: UIBarButtonItem = UIBarButtonItem(title: "Return", style: .done, 
          target: target, action: myAction) // << here !!
    ...

2) pass controller как цель

...
lastNamePasswordTextField.delegate = self
phoneNumberTextField.addReturnButtonOnKeyboard(target: self, // << here !!
    myAction: #selector(phoneNumberShouldReturn(sender:)))
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...