2016-11-30 5 views
0

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

func takePasscodeToEnableTouch(){ 
    self.passcodeInputOperationType = .EnableTouchID 

    alertControllerPassCodeEntry = UIAlertController(title: "", message: "Enter Passcode to enable the Touch Id.", preferredStyle: UIAlertControllerStyle.Alert) 

    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (action) -> Void in 
    } 
    alertControllerPassCodeEntry!.addAction(cancelAction) 

    alertControllerPassCodeEntry!.addTextFieldWithConfigurationHandler { (txtField) -> Void in 
     txtField.placeholder = "Enter passcode" 
     txtField.delegate = self 
     txtField.tag = TextFieldTag.EnterPassCode 
     txtField.keyboardType = UIKeyboardType.NumbersAndPunctuation 
     txtField.accessibilityIdentifier = "PassCode" 
     txtField.secureTextEntry = true 
     txtField.addTarget(self, action:"textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) 
    } 

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    appDelegate.window?.rootViewController?.presentViewController(alertControllerPassCodeEntry!, animated: true, completion: nil) 
} 

И методы TextField делегата:

func textFieldShouldBeginEditing(textField: UITextField) -> Bool 
{ 
    return true 
} 

func textFieldDidBeginEditing(textField: UITextField) // became first responder 
{ 

} 

func textFieldShouldEndEditing(textField: UITextField) -> Bool 
{ 
    return true 
} 

func textFieldDidEndEditing(textField: UITextField) 
{ 

} 

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
{ 
    var isLimitExist: Bool 
    var accessIndentifier: String 
    if let str = textField.accessibilityIdentifier 
    { 
     accessIndentifier = str 
    } 
    else 
    { 
     accessIndentifier = "" 
    } 

    //checkFieldLimit function is used to check the limit of text and restrict 
    isLimitExist = UIUtils.checkFieldLimit(accessIndentifier, stringToMatch: textField.text!, rangeLength: range.length, stringLength: string.characters.count) 

    if !isLimitExist 
    { 
     return false 
    } 
    return true 
} 
+0

Где методы делегата текстового поля? Обновите свой вопрос с помощью методов делегата, которые не вызываются. – rmaddy

+1

И почему у вас есть все эти '!' В вашем коде? – rmaddy

+0

Я сохраняю ссылку на контроллер предупреждения. и я сделал это необязательным. –

ответ

1

Итак, с информацией из комментариев, теперь все кажется ясным. Напомним, вызывается метод, показывающий, как это предупреждение:

@IBAction func swtchTouchAction(sender: UISwitch) { 
    if sender.on { 
     let passCodeManager = PasscodeManager() 
     passCodeManager.delegate = self 
     passCodeManager.takePasscodeToEnableTouch() 
    } else { 
     let passCodeManager = PasscodeManager() 
     passCodeManager.delegate = self 
     passCodeManager.authenticatePasscodeToDisalbeTouch() 
    } 
} 

Теперь, вы не оставляете (то есть - назначить сильной собственности) в passCodeManager где-нибудь здесь. Это означает, что в конце этого метода этот объект уничтожается (благодаря ARC - Automatic Reference Counting). Можно подумать, что он будет сохранен, потому что вы назначили его как текстовое поле delegate, но делегаты: weak proeprties 99,99% времени - это означает, что они не ударяют количество удержаний объектов, назначенных им.

Чтобы решить проблему сразу же следует сделать свойство в классе, в котором у вас есть swtchTouchAction метод и изменить свой код так:

var passCodeManager: PasscodeManager? 

@IBAction func swtchTouchAction(sender: UISwitch) { 
    if sender.on { 
     self.passCodeManager = PasscodeManager() 
     self.passCodeManager?.delegate = self 
     self.passCodeManager?.takePasscodeToEnableTouch() 
    } else { 
     self.passCodeManager = PasscodeManager() 
     self.passCodeManager?.delegate = self 
     self.passCodeManager?.authenticatePasscodeToDisalbeTouch() 
    } 
} 

Этого будет достаточно, чтобы сохранить ваш менеджер кода доступа.

Я также предлагаю вам ознакомиться с тем, как memory management is done in Swift.

+0

Огромное спасибо Лосиоваты. –

Смежные вопросы