2015-04-09 27 views
5

Mam touchID skonfigurować i działa dobrze w mojej aplikacji.Ustawianie TouchID "Enter Password" powrót do edycji UITextField

Chciałbym jednak zmienić funkcję "Wprowadź hasło".

Tworząc moje uwierzytelniania byłem po samouczku: http://www.appcoda.com/touch-id-api-ios8/

Jednak one użytkownikowi alertView dla opcji „Wprowadź hasło”.

Chciałbym odrzucić touchID alertview i sprawić, że moje hasłoTextField stanie się pierwszym odpowiadaniem.

Oczywiście próbowałem:

self.passwordTextField.becomeFirstResponder() 

Ale to powoduje błąd:

2015-04-09 10:48:42.309 Formula Stocks[3933:964941] *** Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView<NSTextContainerView> *, NSTextContainer *, NSUInteger)(), /SourceCache/UIFoundation/UIFoundation-371.13/UIFoundation/TextSystem/NSLayoutManager_Private.m:1547 
2015-04-09 10:48:42.312 Formula Stocks[3933:964941] <NSXPCConnection: 0x1701061e0> connection to service named com.apple.CoreAuthentication.daemon: Warning: Exception caught during decoding of received reply to message 'evaluatePolicy:options:reply:', dropping incoming message and calling failure block. 

Exception: Only run on the main thread! 

oto moja funkcja uwierzytelniania:

func requestFingerprintAuthentication() { 
    // Get the local authentication context. 
    let context = LAContext() 

    // Declare a NSError variable. 
    var error: NSError? 

    // Set the reason string that will appear on the authentication alert. 
    var reasonString = "Sign In." 

    // Check if the device can evaluate the policy. 
    if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error) { 
     [context .evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: { (success: Bool, evalPolicyError: NSError?) -> Void in 

      if success { 
       NSOperationQueue.mainQueue().addOperationWithBlock({() -> Void in 
        println("successfull signin with touchID") 
        self.emailTextField.text = emailID as! String 
        self.passwordTextField.text = passwordID as! String 
        self.signIn(self.signInButton) 
       }) 
      } 
      else{ 
       // If authentication failed then show a message to the console with a short description. 
       // In case that the error is a user fallback, then show the password alert view. 
       println(evalPolicyError?.localizedDescription) 

       switch evalPolicyError!.code { 

       case LAError.SystemCancel.rawValue: 
        println("Authentication was cancelled by the system") 

       case LAError.UserCancel.rawValue: 
        println("Authentication was cancelled by the user") 

       case LAError.UserFallback.rawValue: 
        println("User selected to enter custom password") 
        self.passwordTextField.becomeFirstResponder() 

       default: 
        println("Authentication failed") 
        self.passwordTextField.becomeFirstResponder() 
       } 
      } 

     })] 
    } 
    else{ 
     // If the security policy cannot be evaluated then show a short message depending on the error. 
     switch error!.code{ 

     case LAError.TouchIDNotEnrolled.rawValue: 
      println("TouchID is not enrolled") 

     case LAError.PasscodeNotSet.rawValue: 
      println("A passcode has not been set") 

     default: 
      // The LAError.TouchIDNotAvailable case. 
      println("TouchID not available") 
     } 

     // Optionally the error description can be displayed on the console. 
     println(error?.localizedDescription) 

     // Show the custom alert view to allow users to enter the password. 
     //self.showPasswordAlert() 
     self.passwordTextField.becomeFirstResponder() 
    } 
} 

Robi wydrukować

Optional("Fallback authentication mechanism selected.") 
User selected to enter custom password 

Tak wiem, że to dzwoni poprawnego .case

Każda pomoc coraz to aby wybrać mój UITextField byłoby bardzo mile widziane!

+1

czy próbowałeś wstawić obiekt główny do głównego wątku? –

+0

@PaulCezanne Nie, nie wiem, jak byś to zrobił? –

+0

@PaulCezanne Zajęło mi trochę czasu, aby dowiedzieć się. Ale Twoja sugestia zadziałała, dziękuję :) –

Odpowiedz

4

W głównym wątku należy umieścić opcję ZostańFirstResponderem. iOS wymaga, aby wszystkie operacje interfejsu użytkownika były w głównym wątku. Często uzyskujesz UI przypadkowo z głównego wątku, gdy używasz zamknięć (bloków w Objective-C). Najczęściej pojawiającym się błędem jest to, że interfejs "zawiesza się" na kilka sekund. To klasyczny przypadek, gdy nie musisz być w głównym wątku, kiedy musisz.

Twój przypadek jest trochę inny, ale log w konsoli dał odpowiedź: "Wyjątek: biegnij tylko na głównym wątku!"