Swift self.performSegueWithIdentifier随机工作

时间:2016-05-22 04:18:18

标签: ios swift

在我的代码中,我定义了一个函数,它是在Side菜单上执行的操作的delgate,所以当您点击菜单menuDelegate?.selectionDelegate(Actions.Logout)中的Logout操作时,执行并且下面的函数是处理回调的委托:

@objc func sideMenuAction(action: action) {
        if(action == .Logout){
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                self.performSegueWithIdentifier("unwindToLogin", sender: self)
            })
        }
}

9 out of 10次此工作正常并且具有用户被抛回到登录视图控制器的预期结果,该控制器在故事板中具有unwindToLogin标识符,其中它们可能位于导航堆栈中。但是有一次它不起作用,当执行self.performSegueWithIdentifier行时,没有任何反应!没有错误或警告,当发生这种情况时,override func prepareForSegue在执行该行后不会被调用!

我注意到的另一件事是,当触发此问题时,CPU使用率仍然远远超过100%。应用程序通常的CPU使用率最多为30%/ 40%,不超过1/2秒。

重现起来很困难,当它发生时,我无法弄清楚发生了什么。寻找一些提示来帮助调试可能的原因。

一旦我能够重现该问题,视图层次结构如下所示:

    (lldb) expr -l objc++ -O -- [UIViewController _printHierarchy]


    <SWRevealViewController 0x12585ea00>, state: appeared, view: <SWRevealView 0x1256f3c70>
       | <demoApp.MenuViewController 0x12575daa0>, state: appeared, view: <UIView 0x12743e670>
       | <UINavigationController 0x126047000>, state: appeared, view: <UILayoutContainerView 0x125755270>
       |    | <demoApp.InitialViewController 0x125760050>, state: disappeared, view: <UIView 0x1256e2b30> not in the window
       |    | <demoApp.MainViewController 0x1257f11f0>, state: disappeared, view: <UIView 0x1257f8df0> not in the window
       |    | <demoApp.DetailViewController 0x127617250>, state: appeared, view: <UIView 0x1274f2280>

我应该补充一点,应用程序有两个影响视图层次结构的流程:

   Flow 1: User has never provided credential so Login View -> Initial View -> Main -> ......
   Flow 2: User has already logged in once so Initial View -> Main -> .......

&#34; unwindToLogin&#34; identifier属于unwind IBAction的Login View控制器

1 个答案:

答案 0 :(得分:1)

如果在视图控制器层次结构中的任何视图控制器中找不到展开segue IBAction方法,则会发生这种情况。这可能由于各种原因而发生。也许所讨论的视图控制器根本不在视图控制器层次结构中。或者您可能从一个视图控制器转换到另一个视图控制器而不保持视图控制器层次结构与视图层次结构同步(例如,如果您通过将addSubview一个视图控制器视图转换为另一个视图控制器,从而从一个视图控制器转换到另一个视图控制器做必要的addChildViewController电话)。或者您可能在某处手动换出了根视图控制器。但是,在现有视图控制器层次结构中的任何视图控制器中都找不到用于展开segue的IBAction的底线,某种方式,某些方式。

关键是首先找到发生这种情况的情况。 (我知道你说它很难重现,但要继续尝试直到你的问题出现。)一旦你这样做,暂停执行并查看视图控制器层次结构。例如,点击调试器中的“暂停”按钮(或添加断点)并打印视图层次结构,如果在Swift框架中,请在(lldb)提示符处输入以下内容:

expr -l objc++ -O -- [UIViewController _printHierarchy]

或者如果在Objective-C框架中,只需:

po [UIViewController _printHierarchy]

例如:

enter image description here

确保目标视图控制器出现在视图控制器层次结构中。更有可能的是,它不存在,一旦你确认了这个问题,就必须回溯并找出所讨论的视图控制器如何从视图控制器层次结构中省略。如果您查看应用程序中发生的所有视图控制器转换,您可能会发现一个未执行标准转换的转换。