不调用UITextField委托方法

不调用UITextField委托方法

问题描述:

我正在用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) 
} 

而且文本框的委托方法:

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

我保留警报控制器的参考。我做了选择。 –

好了,从评论的信息,现在一切都似乎很清楚。总括来说,你调用显示这样的警报的方法:

@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,但代表的时间为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

非常感谢你Losiowaty。 –