如何覆盖后面的navigationItem?

时间:2013-11-19 23:37:28

标签: ios ios7 uinavigationitem

在我的RecordViewController中,在didSelectRowAtIndexPath内我推送了一个detailViewController(继承自UIViewController):

[[self navigationController] pushViewController:detailViewController animated:YES];

一旦DetailViewController出现,我可以在左上角看到Back navigationButton,它会自动弹出当前视图控制器以返回到之前的ViewController。

现在我需要显示UIAlertView并询问用户是否应该保存数据。

只有当用户做出决定时,当前的视图控制器才会消失。

我的问题是,如果我将此代码放入viewWillDisappear,那已经太晚了。在显示UIAlertView时,我无法停止此过程。这需要在用户按下后退按钮时被拦截。

我可以覆盖一种方法来实现这个目标吗?

3 个答案:

答案 0 :(得分:1)

创建一个UIBarButtonItem:

UIBarButtonItem * backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @"Back"
    style: UIBarButtonItemStyleDone target: self action: @selector(onBackButtonTapped:)];

将其分配给左栏按钮项目:

self.navigationItem.leftBarButtonItem = backBarButtonItem;

实施onBackButtonTapped API:

- (void) onBackButtonTapped: (id) sender
{
    // Display an UIAlertView
}

您可能想要自定义后退按钮。请查看UIBarButtonItem了解更多详情。

答案 1 :(得分:0)

而不是推送详细视图控制器,收集数据的常用方法是以模态方式呈现一个。这将在(新)导航栏的左侧和右侧为您提供2个空闲空间,以放置“保存”和“取消”按钮。

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[self presentViewController:navigationController animated:YES completion:nil];
// detailViewController will have to set up buttons in its init

您可以使用您创建的委托协议来处理呈现(即非详细信息)视图控制器中的保存和取消操作。

答案 2 :(得分:0)

概述:我们的想法是拥有自己的barbutton来拦截VC的退出。

在viewDidLoad中,您可以执行此操作

UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back"
    style:UIBarButtonItemStyleDone target:self action:@selector(Back:)];
self.navigationItem.backBarButtonItem = backButtonItem;

然后你的Back:方法可以做到这一点

-(void)Back:(id) sender
{
    //Your code for showing AlertView with delegate as self. Remember to conform to the UIAlertViewDelegate protocol.
}

然后将您的保存功能放在

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (selected buttonIndex is the one for saving data)
    {
        //save your data            
    }
    //popViewController
}