web-dev-qa-db-fra.com

Utiliser presentViewController d'UIView

Je crée une barre de titre pour mon application iOS et je la crée dans un UIView. Le seul problème que j'ai est avec le "bouton d'accueil". Lorsque vous appuyez sur le bouton d'accueil, vous devez accéder à la page d'accueil, ViewController. 

Cependant, il semble que [self presentViewController:vc animated:NO completion:NULL]; ne fonctionne pas pour UIView. 

Comment puis-je contourner ce problème?

- (void) createTitlebar {

    CGRect titleBarFrame = CGRectMake(0, 0, 320, 55);

    //Create the home button on the top right of the page. When clicked, it will navigate to the home page of the application
    homeButton = [UIButton buttonWithType:UIButtonTypeCustom];
    homeButton.frame = CGRectMake(275, 10, 40, 40);
    [homeButton setTag:1];
    [homeButton setImage:[UIImage imageNamed:@"homeIcon.png"] forState:UIControlStateNormal];
    [homeButton addTarget:self action:@selector(homeButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:homeButton];
}

- (IBAction)homeButtonPressed:(id)sender{

    //Transition to the submit button page
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];
    [self presentViewController:vc animated:NO completion:NULL];
}
20
Ashish Agarwal

Seul UIViewController peut présenter un autre contrôleur de vue. Par conséquent, si vous avez besoin d'afficher un contrôleur de vue de vue, vous avez plusieurs possibilités, l'une d'entre elles est la suivante:

faire un contrôleur de vue sur lequel votre vue parent est située un délégué de celui-ci

ParentView *view = [ParentView new];
...
view.delegate = self;

puis, dans la méthode d'appel ParentView de ce délégué

- (IBAction)homeButtonPressed:(id)sender {
    [self.delegate buttonPressed];
}

et ensuite, à l'intérieur de votre implémentation VC

 -(void)buttonPressed {
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
    [vc setModalPresentationStyle:UIModalPresentationFullScreen];
    [self presentViewController:vc animated:NO completion:NULL];
}

Si vous devez conserver ce code dans UIView et éviter la délégation, vous pouvez faire un truc comme celui-ci (personnellement, je ne l'aime pas, mais cela devrait fonctionner)

-(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];
}
15
alex

Vous pouvez le faire sans utiliser le modèle de délégué. Voici

Objectif c

UIViewController *currentTopVC = [self currentTopViewController];
currentTopVC.presentViewController......... 

- (UIViewController *)currentTopViewController {
    UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
    while (topVC.presentedViewController) {
        topVC = topVC.presentedViewController;
    }
    return topVC;
}

Rapide

var topVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil) {
     topVC = topVC!.presentedViewController
}
topVC?.presentViewController........
36
Shamsudheen TK

Voici une version plus idiomatique de Swift 3 de la réponse de Shamsudheen:

extension UIApplication {

    static func topViewController() -> UIViewController? {
        guard var top = shared.keyWindow?.rootViewController else {
            return nil
        }
        while let next = top.presentedViewController {
            top = next
        }
        return top
    } 
}

Ensuite, vous pouvez simplement appeler:

UIApplication.topViewController()?.present(...)
4
Hans Brende

Vous pouvez essayer le code ci-dessous

 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]; 
2
Hardik Thakkar

Avec Swift 4 - 4.2 Ajout de la réponse de Shamsudheen TK. 

var topVC = UIApplication.shared.keyWindow?.rootViewController
    while((topVC!.presentedViewController) != nil) {
        topVC = topVC!.presentedViewController
    }
    let customViewController = CustomViewController()
    topVC?.present(customViewController, animated: true, completion: nil)

Avec UINavigationController: Voici également une fonctionnalité supplémentaire -> Vous pouvez transmettre un UINavigationController avec votre 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)
1
N. Der