2016-11-30 12 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

[OK]を、コメントからの情報で、すべてが今明らかと思われるようにします。要約すると、次のような警告を示すメソッドを呼び出します。

@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%の時間です - つまり、割り当てられたオブジェクトの保持カウントをバンプしません。これは、あなたのパスコードマネージャを保持するのに十分だろう

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() 
    } 
} 

はあなたが swtchTouchActionメソッドを持っているあなたのクラスのプロパティを作成し、このようにコードを変更する必要があり、あなたの当面の問題を解決するには。

また、memory management is done in Swiftの読み方をお勧めします。

+0

ありがとうLosiowaty。 –

関連する問題