В экземпляр отправлен неизвестный селектор, причина: '-[UITouchesEvent rightView]

Мое приложение вылетает и выдает эту ошибку

[UITouchesEvent rightView]: unrecognized selector sent to instance 0x13d5092e0
2016-08-04 17:07:15.569 [3809:1375151] 

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITouchesEvent rightView]: unrecognized selector sent to instance 0x13d5092e0'

*** First throw call stack:
(0x180d72db0 0x1803d7f80 0x180d79c4c 0x180d76bec 0x180c74c5c 0x1000e681c 0x1000e6a60 0x185f08be8 0x185f08b64 0x185ef0870 0x185f11360 0x185f07ed8 0x185f00c20 0x185ed104c 0x185ecf628 0x180d2909c 0x180d28b30 0x180d26830 0x180c50c50 0x182538088 0x185f3a088 0x1000f5c88 0x1807ee8b8)
libc++abi.dylib: terminating with uncaught exception of type NSException

Я пытаюсь создать собственный класс для скрытия и отображения пароля, чтобы я мог использовать его в любом UITextField в любом UIViewController.

class HideShowIcon:NSObject {

    var showPasswordImage = UIImage(named: "ic_show_password") as UIImage?
    var hidePasswordImage = UIImage(named: "ic_hide_password") as UIImage?


    func hideShowPasswordButton(hideText:UITextField) {

        var hideShowSize: CGSize = "12345".sizeWithAttributes([NSFontAttributeName:UIFont.systemFontOfSize(14.0)])
        var hideShow: UIButton = UIButton(type: UIButtonType.System)
        hideShow.frame = CGRect(x: 0, y: 0, width: hideShowSize.width, height: hideText.frame.size.height)
        hideShow.setImage(hidePasswordImage, forState: UIControlState.Normal)
        hideText.rightView = hideShow
        hideText.rightViewMode = UITextFieldViewMode.Always
        hideShow.addTarget(self, action: #selector(HideShowIcon.hideShowPasswordTextField(_:hideText:)), forControlEvents: UIControlEvents.AllTouchEvents)

    }
    func hideShowPasswordTextField(sender: AnyObject,hideText:UITextField) {

        var hideShow: UIButton = (hideText.rightView as? UIButton)!
        if !hideText.secureTextEntry {
            hideText.secureTextEntry = true

            hideShow.setImage(hidePasswordImage, forState: UIControlState.Normal)
        } else {
            hideText.secureTextEntry = false
            hideShow.setImage(showPasswordImage, forState: UIControlState.Normal)
        }
        hideText.becomeFirstResponder()
    }
}

person Community    schedule 04.08.2016    source источник


Ответы (1)


Вы не можете использовать селектор со многими параметрами hideShowPasswordTextField(_:hideText:) для UIButton цели. Вы можете использовать селектор только с одним (или нулевым) параметром, в котором UIButton поместит себя: hideShowPasswordTextField(_:)

func hideShowPasswordTextField(sender: UIButton) {
    //...
}

Чтобы использовать hideText в этой функции, вы можете объявить его как свойство вашего класса:

var hideText: UITextField!

и присвоить ему значение на этапе инициализации класса

person Shadow Of    schedule 04.08.2016
comment
При этом, нажимая кнопку скрытия и отображения изображения, я могу видеть текст при длительном нажатии кнопки для скрытия и отображения. При нажатии один раз и выходе текст возвращается в скрытое состояние - person ; 05.08.2016
comment
Спасибо . Оно работает. Мне пришлось изменить UIControlEvents.AllTouchEvents на touchUpInside. - person ; 05.08.2016