Templar
Templar

Reputation: 1694

presentViewController completion block not executing

I have a strange problem, the completion block from presentViewController doesn't execute lately. This is the code called on button tap

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

DebugViewController is this class, self is a UIViewController in a structure like this: JASidepanels ---> (center panel) UINavigationController ---> self

As expected, the exact same code works in any other project, but it isn't working in mine since a few weeks. I recently added JASidePanels and some other Pods.

Here is what know surely :

Any idea how could I debug why the block doesn't execute for me ?

Edit: Wow, this is extremely strange. I debugged whole day and tried to delete code line-by-line. However it seems I found something really really interesting. If on any of my viewcontrollers there is a property named exactly currentAction (which is the case in one of my VCs), the completion blocks won't execute in the whole application ! Can someone please confirm ? Here is a gist GIST, change it to currentAction.

Upvotes: 3

Views: 1952

Answers (2)

Caleb
Caleb

Reputation: 125007

If on any of my viewcontrollers there is a property named exactly currentAction, the completion blocks won't execute in the whole application ! Can someone please confirm ?

That's probably because UIViewController has an instance variable called _currentAction, as you can see in this part of UIViewController.h:

id               _dimmingView;
id               _dropShadowView;

id                _currentAction;
UIStoryboard     *_storyboard;

Declaring a property called currentAction and using the default synthesis for the accessors would interfere with that ivar. To avoid that, explicitly synthesize the accessors and provide a different name for the ivar to back your property. Try adding a line like this to your class:

@synthesize currentAction=_myCurrentAction;

That might help you avoid interfering with the existing ivar, as long as UIViewController only accesses _currentAction directly and doesn't use any internally-declared accessor or KVC.

Upvotes: 1

Duncan C
Duncan C

Reputation: 131471

Don't use alloc/init to create a view controller. Ether load it from a storyboard using instantiateViewControllerWithIdentifier:, or load it from a nib using initWithNibName:bundle:.

That is likely the cause of your problem.

Upvotes: -2

Related Questions