3

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

我看到了其他几种可能性:

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

但我不喜欢这两种选择。因此,如果有一种方法可以实现我想要的,我想使用它。

4

6 回答 6

3

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

但是,如果您尝试为根视图控制器设置target和属性,它将不起作用。显然这些必须为零。actionnavigationItem.backBarButton

解决此问题的一种方法可能是用自定义按钮替换标准后退栏按钮。您可以使用标准来做到这一点UIBarButtonItem,但您会失去“箭头”形状,因为它不能作为其中一种样式使用。一种解决方法可能是为按钮使用自定义视图。查看此线程以获取执行此操作的示例。

于 2009-12-15T20:19:11.327 回答
0

虽然您可能已经从这个问题继续前进了一段时间,但我今天刚刚遇到了这个问题。我的猜测是 Apple 不希望您覆盖这些后退按钮的操作。我的解决方案是显示和警告视图(显示在您刚刚移动到的视图控制器上)并使用 AlertViews 委托方法“clickedButtonAtIndex”将用户移回出现错误的屏幕。总的来说,我认为它实际上非常干净。我的2美分...

于 2010-03-12T21:22:14.770 回答
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];
}
于 2009-12-16T08:13:35.237 回答
0

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

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

self.navigatingTo = NavigatingToNameEdit;

然后在您的数据视图中viewWillAppear,检查并从编辑视图中提取相关信息:

if (self.navigatingTo == NavigatingToNameEdit) {
    self.name = self.nameEditView.name;
    // Don't forget to reset navigatingTo:
    self.navigatingTo = NavigatingToNone;
}
于 2009-12-24T00:05:12.963 回答
0

只需覆盖 UIViewController 子类中的 [popViewControllerAnimated:] 即可。这样你就可以覆盖视图控制器离开屏幕的更一般的场景。

于 2009-12-16T04:37:19.137 回答
0

另一种方法,例如,如果用户点击 UITableView 中的一行,将是让点击启动视图控制器弹出。

于 2009-12-23T23:43:04.023 回答