设置 TouchID "Enter Password" 回退以开始编辑 UITextField
Setting the TouchID "Enter Password" fallback to start editing UITextField
我设置了 touchID,并且在我的应用程序中运行良好。
但是我想更改 "Enter Password" 的功能。
创建我的身份验证时,我遵循了以下教程:http://www.appcoda.com/touch-id-api-ios8/
但是他们为 "Enter Password" 选项使用了 alertView。
我想关闭 touchID 警报视图并使我的 passwordTextField 成为第一响应者。
当然我试过了:
self.passwordTextField.becomeFirstResponder()
但这会导致错误:
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!
这是我的身份验证函数:
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()
}
}
确实打印出来了
Optional("Fallback authentication mechanism selected.")
User selected to enter custom password
所以我知道它调用了正确的 .case
如能帮助 select 我的 UITextField
将不胜感激!
你需要把 becomeFirstResponder 放在主线程上。 iOS 要求所有 UI 操作都在主线程上进行。在使用闭包(Objective-C 中的块)时,您经常会 UI 不小心离开主线程。您遇到的常见错误是 UI "freezes" 持续几秒钟。这就是当你需要时不在主线程上的经典案例。
你的情况有点不同,但控制台中的日志给出了答案:"Exception: Only run on the main thread!"
我设置了 touchID,并且在我的应用程序中运行良好。
但是我想更改 "Enter Password" 的功能。
创建我的身份验证时,我遵循了以下教程:http://www.appcoda.com/touch-id-api-ios8/
但是他们为 "Enter Password" 选项使用了 alertView。
我想关闭 touchID 警报视图并使我的 passwordTextField 成为第一响应者。
当然我试过了:
self.passwordTextField.becomeFirstResponder()
但这会导致错误:
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!
这是我的身份验证函数:
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()
}
}
确实打印出来了
Optional("Fallback authentication mechanism selected.")
User selected to enter custom password
所以我知道它调用了正确的 .case
如能帮助 select 我的 UITextField
将不胜感激!
你需要把 becomeFirstResponder 放在主线程上。 iOS 要求所有 UI 操作都在主线程上进行。在使用闭包(Objective-C 中的块)时,您经常会 UI 不小心离开主线程。您遇到的常见错误是 UI "freezes" 持续几秒钟。这就是当你需要时不在主线程上的经典案例。
你的情况有点不同,但控制台中的日志给出了答案:"Exception: Only run on the main thread!"