【问题标题】:How can my UIViewController know who put it on the stack?我的 UIViewController 怎么知道是谁把它放到堆栈上的?
【发布时间】:2011-07-22 15:13:37
【问题描述】:

这是对已定义架构的旧版 iPhone 应用程序的补充(几年前,由其他人定义。)

主要限制是主菜单系统的功能是基于配置文件的,所以我不能从主菜单调用任何特定的初始化代码。

这意味着我正在开发的视图是独立的,并且必须以某种方式使用来自系统的信息来管理其状态。

此外,在每个屏幕上都有一个“设置”按钮,将用户带到设置窗格,该窗格被推送到“我的”视图顶部的导航堆栈上。当用户关闭设置窗格时,我的视图会按照正常导航重新出现。

好的,这是我的问题:

当用户从菜单进入我的视图时,我希望它被重置,所以所有输入字段都是空的。

如果用户转到设置屏幕并返回到我的屏幕,我希望保留所有以前的输入,即不重置为空字段。

如果用户随后返回主菜单并重新进入我的屏幕,则字段应该再次为空。

是否有可靠、有文档且最好是简单的方法来知道我是否应该在这种情况下重置字段?

【问题讨论】:

  • “旧版 iPhone 应用”...我老了...

标签: iphone ios cocoa-touch uiviewcontroller


【解决方案1】:

您能否检查导航堆栈以查看设置页面当前是否在堆栈中?

- (void)viewWillAppear:(BOOL)aAnimated
{
    [super viewWillAppear:aAnimated];

    NSArray* stack = [[self navigationController] viewControllers];

    UIViewController* last = [stack lastObject];
}

【讨论】:

  • 不幸的是,设置控制器已经从堆栈中弹出(刚刚尝试过),所以没有骰子。可惜,它本来会很好,简单且健壮。
  • 使用 [[self navigationController] viewControllers] 来查看堆栈的想法非常有用 - 我只需将其放入 viewDidDisappear 即可从中获取一些有用的信息。有用的信息是:1)有一个堆栈,2)顶部的项目刚刚从某个地方推到它上面。这和出栈不同,因为当这个方法被调用时,self.navigationController 为 nil。
  • 感谢 Daniel R Hicks 确定要使用的事件处理程序,这种方法似乎提供了我需要的信息,尽管有点倒退。感谢大家的想法!
  • 当然,并不是每个应用程序都使用导航控制器。
  • @HotLicks 当然,并不是每个应用程序都不使用导航控制器 ;-)
【解决方案2】:

大概 viewDidDisappear 在您的视图由于某种原因被隐藏时被调用。您大概可以获取 UIWindow 并处理视图链以查找视图在链中的位置(如果有的话)以及隐藏它的内容。

不过,这并非微不足道,而且可能需要“迷宫般明亮”而不是强大。

(尽管如果始终使用导航控制器,它会变得更加简单。)

【讨论】:

  • 此方法 (viewDidDisappear) 是要使用的事件中的赢家 - 感谢您指出。请参阅 Sam 的回答,了解获取堆栈的简单方法。
【解决方案3】:

在有问题的视图控制器中,你如何设置一个委托。

id delegate;
@property (nonatomic, assign) id delegate;

对于头部,然后在实现中综合。

每当您推送到此视图控制器时,将self 设置为推送视图的委托。然后在这个视图控制器中,您可以在viewDidLoadviewDidAppear:(或您认为有必要的任何地方)中执行检查,如下所示:

if ([self.delegate isKindOfClass:[SomeClass class]]) {
    // now you can find which class sent to this view;
}

这应该可以解决问题,所以我希望它可以帮助你

编辑:考虑到您在不总是使用导航控制器的情况下切换视图,上述内容并非一直有效。在这种情况下,您最好使用内部属性以及设置窗格的出口。所以在这个视图控制器中,你会在标题中想要这样的东西:

BOOL shouldReset;
@property (readwrite) BOOL shouldReset;

在您的viewDidLoad 中,您需要将其初始化为shouldReset = YES。你也应该把它放在你的viewDidDisappear: 中,因为这是你的默认行为。当您显示设置窗格时,为当前视图控制器提供一个出口,以便您可以从设置中(当您按下后退按钮时)设置[self.otherViewController setShouldReset:NO]。然后在您的 viewDidAppear: 中为有问题的原始视图控制器,您可以检查它是否应该重置其字段

【讨论】:

  • 不错的主意,但它不需要我修改处理主菜单的代码,更不用说处理设置窗格中“返回”按钮的系统提供的导航控制器了吗?
  • 不应该,不。所有这一切真正要做的就是给你一个出口到你刚刚来自的地方......等一下,你不会一直通过推送/弹出来切换到视图,所以这并不总是有效。我将编辑对更适合您需要的内容的响应。对此感到抱歉
  • 不,我的问题是不是“我”,就像在我的代码中那样,将视图推送到堆栈上,所以我无法设置委托。我只有我自己的 UIViewController 的事件和我可以从系统中得到的任何东西(比如 UIApplication)。除非我想对原始代码进行更改,但我宁愿不这样做——因为那样的话它会突然变成我的代码,这确实存在风险。
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 2021-12-22
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多