如果没有导航栏,如何在EKEventViewController中获得“完成”或“后退”按钮?

我的iOS应用程序中有一个日历事件列表,单击时可以在EKEventViewController中打开。 这是我的代码:

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

事件视图正确地从屏幕底部弹出,但我无法返回事件列表!

我正在使用导航控制器(但没有导航栏!),所以添加此代码使我能够返回列表:

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

但是这个解决方案不是很优雅,因为当我按下事件视图中的“后退”按钮时,在事件视图全部不在屏幕之前,导航栏不会被删除(它显示在我的事件列表视图的顶部)。

如何解决这个问题? 最好的选择是以某种方式在事件视图中得到一个后退按钮,我可以在这里使用第一个代码(所以我会避免显示导航栏),并且视图可以只是滑回到屏幕的底部按下时

解决方案:结束以下代码:

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

看起来你根本不需要隐藏导航栏! 你能解释一下为什么你需要隐藏或显示导航栏吗? 这将是隐藏或显示模型视图的简单解决方案。

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

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

代码示例 –

我会在两种情况下都保留导航栏,因为它是在具有您无法控制的视图层次结构的控制器中放置后退/关闭按钮的最佳位置。

a)模式:

  • 调整EKEventViewController navigationItem并将控制器嵌入UINavigationController 。 然后呈现晚了!

b)推:

  • 不要隐藏导航栏并让自动后退按钮出现。 如果您想为特定控制器设置不同的UI,则a)是更好的方法。

如果您确实在显示的控制器上保留了导航栏,则可以添加如下所示的关闭按钮:

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

刚才实现dismissController:在你的呈现控制器中。