在我的iPhone应用程序中,我有导航控制器,主屏幕和一些编辑屏幕。在编辑屏幕上,用户执行一些必须在我保存之前进行验证的输入。理想情况下,我想在后退导航时自动更新数据而无需额外的“完成”按钮。我是否可以进行一些验证并保存在后退导航上(即当用户点击标准后退按钮时),这种方式允许我停止导航并在出现问题时显示一些错误消息?
我看到其他几种可能性:
但这些选择我更喜欢。所以,如果有办法实现我想要的,我想使用它。
答案 0 :(得分:3)
基本上,您希望覆盖根视图控制器的backBarButton
中的操作,并在那里进行验证。如果验证通过,则调用UINavigationController
popViewControllerAnimated:
,否则显示错误警报或其他任何内容。
但是,如果您尝试为根视图控制器target
设置action
和navigationItem.backBarButton
属性,则无效。显然这些必须是零。
这可能是用自定义按钮替换标准背栏按钮。您可以使用标准UIBarButtonItem
执行此操作,但是您将丢失'箭头'形状,因为它不可用作其中一种样式。解决方法可能是使用按钮的自定义视图。查看this thread以获取相关示例。
答案 1 :(得分:0)
只需覆盖UIViewController子类中的[popViewControllerAnimated:]即可。这样你就可以了解视图控制器离开屏幕的更一般情况。
答案 2 :(得分:0)
我发现“检测何时按下后退按钮”的最佳方法是重新定义viewWillDisappear
,如下所示:
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (!isPushing) {
// Apply your changes here
}
}
布尔值isPushing
将是您自己定义的布尔值,并且仅在您自己推送另一个控制器的地方(如果您这样做...)将其设置为True,这样您就可以区分{ {1}}被调用是因为你自己推动一个新的控制器vs因为按了后退按钮。
您通常会在表控制器中自行推送另一个控制器,如下所示:
viewWillDisappear
答案 3 :(得分:0)
另一种方法,例如,如果用户在UITableView中点击一行,则会点击启动视图控制器弹出窗口。
答案 4 :(得分:0)
另一种方法是让您的父视图完成工作。
假设您从数据视图(例如,联系信息)导航到字段编辑视图(例如,名称编辑)。 在进入编辑视图之前,数据视图会存储有关此事实的一些信息,例如:
self.navigatingTo = NavigatingToNameEdit;
然后在您的数据视图viewWillAppear
中,检查并从编辑视图中提取相关信息:
if (self.navigatingTo == NavigatingToNameEdit) {
self.name = self.nameEditView.name;
// Don't forget to reset navigatingTo:
self.navigatingTo = NavigatingToNone;
}
答案 5 :(得分:0)
虽然你可能刚刚离开这里,但我今天刚遇到这个问题。我的猜测是Apple不希望你重写那些后退按钮的动作。我的解决方案是显示和警告视图(显示在您刚刚移动到的视图控制器上)并使用AlertViews委托方法“clickedButtonAtIndex”将用户移回带有错误的屏幕。总的来说,我认为它实际上非常干净。我的2美分......