Search code examples
iosobjective-cblockpresentviewcontroller

How to dismiss own view controller and present another view controller in a button tap?


Let's say I have 3 view controller labeled "A","B" and "C". Right now, "A" is the rootViewController of the window and it presents "B" modally when a button is tapped. In "B", when a button is tapped it is supposed to be dismissed by "A" and then "A" will present C modally immediately.How can one do that? Here's my code in hope of achieving this goal but I was unsuccessful in doing so.

At "A" viewController, I declared a property to hold a block at the header file to be called when "B" viewController is dismissed by "A".

@property (nonatomic, copy) void (^presentZapLaunch)(void);

This is "A" viewController present method to present "B"

-(void)presentNextViewCon
{
CYCGestureZapZapViewController *gestureViewCon = [[CYCGestureZapZapViewController alloc]init];

if (!self.presentZapLaunch) {
    __weak CYCZapZapViewController *weakRefCon = self;

    self.presentZapLaunch = ^{
        CYCZapZapViewController *preventWeakRefCon = weakRefCon;

        CYCZapZapLaunchViewController *zapLaunch = [[CYCZapZapLaunchViewController     alloc]init];
        NSLog(@"Called");
        [preventWeakRefCon presentViewController:zapLaunch animated:YES completion:nil];

    };
}


[self presentViewController:gestureViewCon animated:YES completion:nil];

}

This is "B" dismiss method to dismissed by "A" and "A" should present "C" immediately

-(void)presentNextViewCon
{
NSLog(@"Hello");
[self.presentingViewController dismissViewControllerAnimated:self completion:^{[(CYCZapZapViewController *)self.presentingViewController presentZapLaunch];}];

}

*Note that I'm using "A" view controller as the rootViewController of window, and "A" presents "B" view controller modally. All "A","B" and "C" are view controllers.


Solution

  • you can do using protocol let say for example as bellow:-

    In to your B viewController setting Protocol :

    @class Bviewcontroller;
    
    @protocol BviewControllerDelegate <NSObject>
    - (void)BviewcontrollerDidTapButton:
    (Bviewcontroller *)controller;
    
    @end
    
    @interface Bviewcontroller : UIViewcontroller
    
    @property (nonatomic, weak) id <BviewControllerDelegate> delegate;
    - (IBAction)ButtonTap:(id)sender;
    
    @end
    

    in .m class

    - (IBAction)ButtonTap:(id)sender
    {
        [self.delegate BviewcontrollerDidTapButton:self];
    }
    

    Now in to you A_viewController .h class:

    #import "Bviewcontroller.h"
    
    @interface A_viewController : UIViewcontroller<BviewControllerDelegate>
    

    .m class

    - (void)BviewcontrollerDidTapButton:
    (Bviewcontroller *)controller
    {
        [self dismissViewControllerAnimated:YES completion:^{
    
    
          // here you can create a code for presetn C viewcontroller 
    
        }];
    }
    

    IMPORTANT when you preseting Bviewcontroller from A_viewController do not set delegate with object like

    -(void)presentNextViewCon
    {
                    bViewcontroller *gestureViewCon = [[bViewcontroller alloc]init];
            gestureViewCon.delegate = self;
    
    [self presentViewController:gestureViewCon animated:YES completion:nil];
    
    }
    

    UPDATE

    Here it is i create a demo that working like:

    enter image description here

    SAMPLE CODE LINK http://speedy.sh/2acSC/modelDemo.zip