1

我有一个带有两个视图的简单应用程序。加载第一个视图后,我正在执行 Touch ID 传感器身份验证(另请参阅问题):

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,但第二个视图只出现片刻,然后应用程序返回第一个视图。好像canEvalutePolicy里面的代码还没写完,所以导航控制器push了第一个view。

我尝试了几件事,例如:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

NSOperationQueue.mainQueue().addOperationWithBlock

还有这些方法的组合,但我无法执行第二个视图的转场并停留在第二个视图中。

任何人都可以帮忙吗?

谢谢,最好的,圭多

4

1 回答 1

4

我能够解决这个问题。问题是导航控制器。

我的解决方案:第一个视图不再嵌入在导航控制器中,它只是与第二个视图有一个连接。

然后将第二个视图嵌入导航控制器(以及其他视图)中,以便在我想要的视图之间进行导航行为。

重要的是使用dispatch_async以便在用户验证后立即“加载”导航控制器:

if success {
  dispatch_async(dispatch_get_main_queue()) {
    self.performSegueWithIdentifier("xxx", sender: self)

如果没有 dispatch_async,第二个视图就会出现,但导航控制器的导航逻辑会丢失大约 15 秒。

于 2014-10-06T14:00:18.543 回答