presentViewController完成块未执行

时间:2014-05-29 10:06:23

标签: ios objective-c objective-c-blocks jasidepanels

我有一个奇怪的问题,presentViewController的完成块最近没有执行。 这是在按钮上调用的代码

    DebugViewController * x = [[DebugViewController alloc] init];
    x.view.backgroundColor = [UIColor redColor];
    [self presentViewController:x animated:YES completion:^{
        NSLog(@"Hello world %@" , self );
    }];

DebugViewControllerthis classselfUIViewController,结构如下: JASidepanels ---> (中心小组)UINavigationController ---> self

正如预期的那样,完全相同的代码适用于任何其他项目,但几周后它在我的工作中不起作用。我最近添加了JASidePanels和其他一些Pod。

以下是肯定的:

  • 显示模态,调用viewWillAppear和viewDidAppear,它会动画显示,它可以正常工作
  • 在呈现VC时调用viewWillDisappear,dealloc不是,所以它是 住。
  • 其他街区工作。
  • 它位于主线程

任何想法我怎么能调试块为什么不为我执行?

编辑:哇,这太奇怪了。我调试了一整天,并试图逐行删除代码。然而,似乎我发现了一些非常有趣的东西。如果在我的任何一个viewcontrollers上都有一个名为currentAction的属性(我的一个VC就是这种情况),那么完成块将不会在整个应用程序中执行!有人可以确认吗?这是一个要点GIST,将其更改为currentAction

2 个答案:

答案 0 :(得分:1)

  

如果在我的任何一个viewcontrollers上有一个名为的属性   currentAction,完成块不会在整体中执行   申请!有人可以确认吗?

这可能是因为UIViewController有一个名为_currentAction的实例变量,正如你在UIViewController.h的这一部分所看到的那样:

id               _dimmingView;
id               _dropShadowView;

id                _currentAction;
UIStoryboard     *_storyboard;

声明一个名为currentAction的属性并使用访问器的默认综合将干扰该ivar。为避免这种情况,请明确合成访问者并为ivar提供不同的名称以支持您的财产。尝试在您的班级中添加这样的一行:

@synthesize currentAction=_myCurrentAction;

可能可以帮助您避免干扰现有的ivar,只要UIViewController只直接访问_currentAction并且不使用任何内部声明的访问者或KVC。

答案 1 :(得分:-2)

不要使用alloc / init来创建视图控制器。 Ether使用instantiateViewControllerWithIdentifier:从故事板加载它,或使用initWithNibName:bundle:从nib加载它。

这可能是导致问题的原因。