When I try to present a UIImageViewController from the table view, the starting animation is a vertical cover, which I want, but when the controller gets dismissed, the animation is a Horizontal Flip. I tried [self presentViewController:self.imageController animated:YES completion:nil]; and [self.navigationController presentViewController:self.imageController animated:YES completion:nil]; but the dismiss animation is the same in both cases. When I remove the middle view controller (i.e just navigation controller with the tableview as its root), the dismiss animation is correct (cover vertical).
Anyone know how I can get the correct dismiss animation with the current storyboard configuration?
You can try this method:
[self.navigationController pushViewController:self.imageController animated:YES];
Related
I have a ViewController with an UISearchController inside (with a table view on it). I've added this line on didSelectRowAtIndexPath::
[self dismissViewControllerAnimated:YES completion:nil];
For some reason, the viewController isn't being dismissed and instead, the keyboard is being dismissed (the searchController becomes inactive), to dismiss the viewController I have to reselect a cell on the table (and then didSelectRowAtIndexPath: is being called twice).
Any idea why is it happening?
Thank you!
This is probably happening because UISearchController inherits from UIViewController and therefore the controller being dismissed in didSelectRow is actually the search controller.
Perhaps simply try dismissing twice so that it removes the search controller followed by your custom view controller:
[self dismissViewControllerAnimated:YES completion:nil];
[self dismissViewControllerAnimated:YES completion:nil];
Try to resigning keyboard first and then dismiss vc.
I have 2 UIViewController's presented with [self presentViewController:viewController animated:YES completion:nil];, I want to dismiss the first one of them, without animation (It's not visible to the user anyway) and when the second one (currently visible) will be dismissed, the user will see the parent view controller who present them both.
- Parent
- First -> Dismiss first without animation
- Second -> Dismiss second with animation
How can I do that?
With your current view controller hierarchy if first view controller will be dismissed it will dismiss second view controller automatically. If you don't want that behaviour than make parent present second view controller. You can do that from first view controller by using [self.presentingViewController presentViewController:secondViewController animated:YES completion:nil]
Why do you want to do this?
You should do it like this for cleaner view hierarchy and better user experience:
Present first view controller :
[self presentViewController:viewController1 animated:YES completion:nil];
Dismiss first & present second view controller :
__weak MyViewController *aBlockSelf = self;
[self dismissViewControllerAnimated:YES completion:^{
[aBlockSelf presentViewController:viewController2 animated:YES completion:nil];
}];
i have a view controller and i need to dismiss it and present it back in same time.
i had tried dismiss it and call back the view controller but not working.
[self dismissViewControllerAnimated:YES completion:nil];
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:#"Main" bundle:nil];
ExpandViewController *expandView=
[storyboard instantiateViewControllerWithIdentifier:#"ExpandViewController"];
expandView.delegate=self;
[expandView setEventDict:dict];
[self presentViewController:expandView animated:YES completion:NULL];
I am not exactly sure what outcome/functionality you are looking for in your question, but #matt is correct. However, you may be looking to have this happen seamlessly. Therefore you could use child view controllers instead of presenting the view controller using the [self presentViewController:VC animated:animate completion:nil] method.
Adding child vc:
[self addChildViewController:myVC];
[self.view addSubview:myVC.view];
[myVC didMoveToParentViewController:self];
Removing child vc:
[myVC willMoveToParentViewController:nil];
... remove subview.
You can set up a delegate between the two controllers to tell the parent when to dismiss the view to make things easy. You can also add the subviews at different indexes using [self.view insertSubview:myVC atIndex:index] or the other possible functions such as the insert above subview etc, to have one subview be added before dismissing the other to give a more seamless transition.
Hope this helps!
You can't present a view controller until the currently presented view controller has finished being dismissed. You won't know this has happened until the completion handler from your dismissal is called. Your mistake is that the completion handler is nil. Instead, provide a completion handler (in your first line), consisting of the remaining lines of your code. Thus, they will execute after the dismissal finishes.
[self dismissViewControllerAnimated:YES completion:^{
// ... the rest of your code goes in here ...
}];
I'm working with SVWebViewController. When I present the view controller here
SVModalWebViewController *webViewController = [[SVModalWebViewController alloc] initWithAddress:address];
webViewController.webDelegate = self;
[self presentViewController:webViewController animated:YES completion:nil];
The view controller slides up from the bottom, as expected. However, when the view controller is dismissed, calling
[self dismissViewControllerAnimated:YES completion:nil];
The view controller simply disappears. No slide animation down. Any thoughts?
EDIT
It turns out a lot of presentation animations aren't displaying correctly in the application. Some pushes on the navigation controller aren't sliding in or sliding out (but some are). They just appear.
[self dismissViewControllerAnimated:YES completion:NULL];
This should be in SVModalWebViewController not SVWebViewController
EDIT: Instead of modally segueing to the SVWebViewController you should push:
SVWebViewController *webViewController = [[SVWebViewController alloc] initWithAddress:#"http://google.com"];
[self.navigationController pushViewController:webViewController animated:YES];
And instead of dismissing you should:
[self.navigationController popViewControllerAnimated:YES];
From SVWebViewController viewWillAppear::
SVWebViewController needs to be contained in a
UINavigationController. If you are presenting SVWebViewController
modally, use SVModalWebViewController instead.
Is your main view controller contained in a navigation controller? If not, this could possibly cause the other animation issues you're facing.
The dismissal should be from the displayed modalViewController.
It happens to me when the destination view controller loads a big picture or background
Suppose i have 3 view controllers. I initiate vc1 in vc0 and then vc2 in vc1. Now i want vc2 to be dismissed and after that only vc0 should be shown behind it. How's that possible? I read something about delegate declaration. But couldn't understand.
I have UISegmentcontrol where i'm displaying a controller from storyboard like - vc0 = [self.storyboard instantiateViewControllerWithIdentifier=#"vc0"]; and making it a subview of it [self.view addSubview:vc0.view]; Vc0 is a tableView, which has a detailcontroller to be presented. When i tap on a cell, it shows detailview, but actual segmentcontrol.view is lost when detailview is dismissed.
An example would be awesome.
PS: I'm not using segue for the viewControllers. Instead, i'm using presentModalViewController and dismissModalViewController.
In iOS 5 you need to do
[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]
As of iOS 6 dismissModalViewControllerAnimated: is deprecated.
You need to call
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{ // Do something on completion}]
//If you want to perform something while going through views or other wise keep completion to nil as shown in below code.
or
[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
or
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];