Using presentViewController from UIView

后端 未结 5 460
鱼传尺愫
鱼传尺愫 2020-12-13 14:52

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

相关标签:
5条回答
  • 2020-12-13 15:33

    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)
    
    0 讨论(0)
  • 2020-12-13 15:36

    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];
    }
    
    0 讨论(0)
  • 2020-12-13 15:37

    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]; 
    
    0 讨论(0)
  • 2020-12-13 15:40

    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........
    
    0 讨论(0)
  • 2020-12-13 15:53

    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(...)
    
    0 讨论(0)
提交回复
热议问题