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];
}
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];
}
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........
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(...)
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];
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)