iPhone:通过后台导航验证保存

时间:2009-12-15 16:10:48

标签: iphone uinavigationcontroller validation back

在我的iPhone应用程序中,我有导航控制器,主屏幕和一些编辑屏幕。在编辑屏幕上,用户执行一些必须在我保存之前进行验证的输入。理想情况下,我想在后退导航时自动更新数据而无需额外的“完成”按钮。我是否可以进行一些验证并保存在后退导航上(即当用户点击标准后退按钮时),这种方式允许我停止导航并在出现问题时显示一些错误消息?

我看到其他几种可能性:

  • 创建我的自定义左按钮,使其看起来像标准背面。 (为什么Apple没有将此按钮样式放入公共API?)
  • 添加“完成”按钮并仅在用户点击时保存数据

但这些选择我更喜欢。所以,如果有办法实现我想要的,我想使用它。

6 个答案:

答案 0 :(得分:3)

基本上,您希望覆盖根视图控制器的backBarButton中的操作,并在那里进行验证。如果验证通过,则调用UINavigationController popViewControllerAnimated:,否则显示错误警报或其他任何内容。

但是,如果您尝试为根视图控制器target设置actionnavigationItem.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美分......