iPhone: 在返回导航时进行验证以节省数据

3
在我的iPhone应用程序中,我有导航控制器、主屏幕和一些编辑屏幕。在编辑屏幕上,用户进行一些输入,必须在保存之前进行验证。理想情况下,我希望在返回导航时自动更新数据,而不需要额外的“完成”按钮。我能否在返回导航时进行一些验证和保存(即当用户点击标准返回按钮时),以一种允许我停止导航并显示一些错误消息的方式?
我看到还有几种其他可能性:
- 创建我的自定义左按钮,并使其看起来像标准的返回按钮。(为什么苹果没有将此按钮样式放入公共API中?) - 添加“完成”按钮,并仅在用户点击它时保存数据。
但这两个选择我都不太喜欢。因此,如果有一种方法可以实现我想要的功能,我想使用它。
6个回答

3
基本上,您想要覆盖根视图控制器的backBarButton操作,并在那里进行验证。如果验证通过,请调用UINavigationController popViewControllerAnimated:,否则显示错误警报或其他内容。
但是,如果您尝试为根视图控制器的navigationItem.backBarButton设置targetaction属性,它将无法正常工作。显然,这些必须为空。
解决方法可能是用自定义按钮替换标准返回按钮。您可以使用标准的UIBarButtonItem来实现这一点,但是您将失去“箭头”形状,因为这不是其中一种样式。解决此问题的方法可能是使用自定义视图来创建按钮。查看此线程以获取示例。

这正是我所说的第一选择,但如果可能的话,我不想模拟本地的外观和感觉。 - SergGr

0
我发现“检测后退按钮被按下”的最佳方法是重新定义viewWillDisappear,如下所示:
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if (!isPushing) {
        // Apply your changes here
    }
}

布尔型变量isPushing是你自己定义的,只有在推送另一个控制器的地方将其设置为True(如果你这样做...),这样可以区分viewWillDisappear被调用是因为你自己推送了一个新的控制器还是因为点击了后退按钮。

通常情况下,在表视图控制器中,你会像这样自己推送另一个控制器:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Example of pushing a new controller onto the navigation stack yourself...
    isPushing = YES;    // You have to set that boolean here...
    [self.navigationController pushViewController:myNewController animated:YES];
}

我知道我可以拦截事件,但问题是我目前看不到停止导航的方法。如果我无法停止导航,那么如果输入验证失败,我就无法做任何合理的事情。 - SergGr

0
只需在您的 UIViewController 子类中覆盖 [popViewControllerAnimated:] 方法。这样,您就可以覆盖更一般的视图控制器离开屏幕的情况。

做不到:popViewControllerAnimated是来自UINavigationController而不是UIViewController...他必须为此制作一个特定(并且独立的)UINavigationController子类 - 这完全不推荐。 - Zoran Simic

0
另一种方法是,如果用户在UITableView中点击了一行,则可以通过点击来启动视图控制器弹出。

0

另一种方法是让您的父视图来完成工作。

假设您从数据视图(例如,联系人信息)导航到字段编辑视图(例如,名称编辑)。 在进入编辑视图之前,数据视图存储有关此事实的一些信息,例如:

self.navigatingTo = NavigatingToNameEdit;

在你的数据视图的viewWillAppear中,检查并从编辑视图中提取相关信息:
if (self.navigatingTo == NavigatingToNameEdit) {
    self.name = self.nameEditView.name;
    // Don't forget to reset navigatingTo:
    self.navigatingTo = NavigatingToNone;
}

0
虽然您可能早就解决了这个问题,但我今天刚遇到了。我猜想苹果不希望您覆盖那些返回按钮的操作。我的解决方案是显示一个警报视图(显示在您刚刚移动到的视图控制器上),并使用AlertViews委托方法“clickedButtonAtIndex”将用户返回到具有错误的屏幕。总体而言,我认为它实际上表现得非常干净。这是我的意见…

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接