Using presentViewController from UIView Using presentViewController from UIView objective-c objective-c

Using presentViewController from UIView


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?.rootViewControllerwhile((topVC!.presentedViewController) != nil) {     topVC = topVC!.presentedViewController}topVC?.presentViewController........


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];}


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(...)