How to dismiss own view controller and present another view controller in a button tap?
block, ios, objective-c, presentviewcontroller
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:
SAMPLE CODE LINK http://speedy.sh/2acSC/modelDemo.zip
Problem
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.