未调用UITextField委托方法

时间:2016-11-30 06:27:48

标签: ios swift uitextfield

我正在使用UITextfield呈现警报,但其委托方法未被调用。我可能做错了什么。我使用以下代码显示带有textfield的警报。

  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
}

1 个答案:

答案 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,但是代理人{99}的时间是weak,这意味着它们不会影响保留计数分配给它们的对象。

要解决您的直接问题,您应该在您的班级中使用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的方式。