I am creating a title bar for my iOS application and I am making this inside a UIView. The only issue I am having is with the \"home button\". When the home button is presse
With Swift 4 - 4.2 Adding onto Shamsudheen TK's answer.
var topVC = UIApplication.shared.keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
let customViewController = CustomViewController()
topVC?.present(customViewController, animated: true, completion: nil)
With UINavigationController: Here is also an additional feature -> You can pass along a UINavigationController with your customViewController.
var topVC = UIApplication.shared.keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
let customViewController = CustomViewController()
let navController = UINavigationController(rootViewController: CustomViewController)
topVC?.present(navController, animated: true, completion: nil)
Only UIViewController can present another view controller, so if you need to show a viewcontroller from view there are several way, one of them is like this:
make a viewcontroller on which your parent view is situated a delegate of it
ParentView *view = [ParentView new];
...
view.delegate = self;
then, inside ParentView call method of that delegate
- (IBAction)homeButtonPressed:(id)sender {
[self.delegate buttonPressed];
}
and then, inside your VC implement
-(void)buttonPressed {
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentViewController:vc animated:NO completion:NULL];
}
If you need to keep this code inside UIView and avoid delegation you can do a trick like this (personally i don't like it but it should work)
-(void)buttonPressed{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[(UIViewController*)self.nextResonder presentViewController:vc animated:NO completion:NULL];
}
You can try below code
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UIViewController *vc1 = [UIApplication sharedApplication].keyWindow.rootViewController;
[vc1 presentViewController:vc animated:YES completion:nil];
You can do this without using the delegate pattern. Here you go
ObjectiveC
UIViewController *currentTopVC = [self currentTopViewController];
currentTopVC.presentViewController.........
- (UIViewController *)currentTopViewController {
UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
while (topVC.presentedViewController) {
topVC = topVC.presentedViewController;
}
return topVC;
}
Swift
var topVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
topVC = topVC!.presentedViewController
}
topVC?.presentViewController........
Here's a more idiomatic Swift 3 version of Shamsudheen's answer:
extension UIApplication {
static func topViewController() -> UIViewController? {
guard var top = shared.keyWindow?.rootViewController else {
return nil
}
while let next = top.presentedViewController {
top = next
}
return top
}
}
Then you can just call:
UIApplication.topViewController()?.present(...)