Comment get un button "Terminé" ou "Précédent" dans un EKEventViewController quand il n'y a pas de barre de navigation?

J'ai une list d'events de calendar dans mon application iOS, qui doit être ouverte dans un EKEventViewController quand on clique dessus. Voici mon code:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { EKEventViewController *eventViewController = [EKEventViewController new]; eventViewController.event = [self.events objectAtIndex:[indexPath row]]; [self presentViewController:eventViewController animated:YES completion:nil]; } 

L'affichage de l'événement apparaît correctement à partir du bas de l'écran, mais je n'ai aucun moyen de revenir à la list des events!

J'utilise un controller de navigation (mais pas de barre de navigation!), L'ajout de ce code m'a donc permis de revenir à la list:

 -(void)viewDidAppear:(BOOL)animated { [self.navigationController setNavigationBarHidden:YES]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { EKEventViewController *eventViewController = [EKEventViewController new]; eventViewController.event = [self.events objectAtIndex:[indexPath row]]; [self.navigationController setNavigationBarHidden:NO]; [self.navigationController pushViewController:eventViewController animated:YES]; } 

Mais cette solution n'est pas très élégante, car lorsque j'appuie sur le button «Retour» dans la vue des events, la barre de navigation n'est pas supprimée (elle apparaît en haut de ma list d'events) avant que la vue des events soit complètement hors écran.

Comment régler ceci? La meilleure option aurait été d'avoir en quelque sorte un button de return dans la vue des events que j'aurais pu utiliser avec le premier code ici (donc j'éviterais d'afficher la barre de navigation), et la vue pourrait simplement revenir au bas de l'écran quand il est pressé.

SOLUTION: Terminé avec le code suivant:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { EKEventViewController *eventViewController = [EKEventViewController new]; eventViewController.event = [self.events objectAtIndex:[indexPath row]]; eventViewController.delegate = self; UINavigationController *navBar = [[UINavigationController new] initWithRootViewController:eventViewController]; [self presentViewController:navBar animated:YES completion:nil]; } - (void)eventViewController:(EKEventViewController *)controller didCompleteWithAction:(EKEventViewAction)action { [self dismissViewControllerAnimated:YES completion:nil]; } 

On dirait que vous n'avez pas besoin de cacher la barre de navigation du tout! Pouvez-vous expliquer plus pourquoi vous avez besoin de cacher ou d'afficher la barre de navigation? Ce sera une solution simple pour cacher ou montrer la vue du model.

// EKEventListVC.m

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { EKEventViewController *pms = [EKEventViewController new]; UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:pms]; [self presentViewController:nav animated:YES completion:nil]; } 

// EKEventViewController.m

 - (void)addRightButton { UIButton *rightButton = // make your button [rightButton addTarget:self action:@selector(rightBtnActionDone:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton]; [self.navigationItem setRightBarButtonItem:barButtonItem]; } 

//

 - (void)rightBtnActionDone:(UIButton *)sender { [self dismissViewControllerAnimated:YES completion:nil]; } 

// Édité pour EKEventKitUI

 -(void)eventEditViewController:(EKEventEditViewController *)controller didCompleteWithAction:(EKEventEditViewAction)action { switch (action) { case EKEventEditViewActionCanceled: // User tapped "cancel" break; case EKEventEditViewActionSaved: // User tapped "save" break; case EKEventEditViewActionDeleted: // User tapped "delete" break; default: break; } [self dismissModalViewControllerAnimated:YES]; } 

Exemple de code –

Je garderais la barre de navigation dans les deux cas car c'est le meilleur endroit pour mettre un button de return / fermeture dans un controller avec une hiérarchie de vue que vous ne contrôlez pas.

a) Modalement:

  • Ajustez l' EKEventViewController navigationItem EKEventViewController et EKEventViewController le controller dans un UINavigationController . Alors présente le plus tard!

b) Pousser:

  • Ne pas masquer la barre de navigation et laisser le button return automatique apparaître. Si vous voulez avoir une interface user différente pour un controller particulier, a) est la meilleure solution.

Si vous gardez la barre de navigation sur votre controller présenté, vous pouvez append un button de rejet comme ceci:

 viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(dismissController:)]; 

Il suffit d'implémenter dismissController: dans votre controller de présentation.