我有一个有两个视图的简单App。加载第一个视图后,我即可执行Touch ID传感器身份验证(另请参阅this问题):
func testTouchID()
{
if touchIDContext.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error:&touchIDError)
{
touchIDContext.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: {
(success: Bool, error: NSError?) -> Void in
if success
{
self.performSegueWithIdentifier("showSecondView", sender: self)
return;
} else {
使用此代码执行segue,但第二个视图只显示片刻,然后App返回到第一个视图。 似乎 canEvalutePolicy 中的代码未完成,因此导航控制器会推送第一个视图。
我尝试了几件事:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
NSOperationQueue.mainQueue().addOperationWithBlock
还有这些方法的组合,但我无法将segue执行到第二个视图并保留在第二个视图中。
有人可以帮忙吗?
谢谢,最好的, 吉
答案 0 :(得分:4)
我能够解决这个问题。问题是导航控制器。
我的解决方案:第一个视图不再嵌入导航控制器中,它只是一个第二个视图的segue。
然后第二个视图嵌入导航控制器(以及其他视图),以便在我想要的视图之间进行导航行为。
重要的是使用 dispatch_async ,以便在用户进行身份验证后立即“加载”导航控制器:
if success {
dispatch_async(dispatch_get_main_queue()) {
self.performSegueWithIdentifier("xxx", sender: self)
如果没有dispatch_async,则会出现第二个视图,但导航控制器的导航逻辑缺失大约15秒。