不调用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
}
答
好了,从评论的信息,现在一切都似乎很清楚。总括来说,你调用显示这样的警报的方法:
@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。 –
文本字段委托方法在哪里?使用未被调用的委托方法更新您的问题。 – rmaddy
为什么你的代码中包含所有'!'? – rmaddy
我保留警报控制器的参考。我做了选择。 –