我的UIViewController怎么知道谁把它放在堆栈上?

时间:2011-07-22 15:13:38

标签: iphone ios cocoa-touch uiviewcontroller

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

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

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

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

好的,所以这是我的问题:

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

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

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

是否有一种强大的,有文档记录的,最好是简单的方法来了解我是否应该在这种情况下重置字段?

3 个答案:

答案 0 :(得分:2)

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

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

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

    UIViewController* last = [stack lastObject];
}

答案 1 :(得分:1)

当您的视图因某种原因被隐藏时,可能会调用viewDidDisappear。您可能会获得UIWindow并处理视图链以查找视图在链中的位置(如果它完全存在)以及隐藏它的内容。

但是,非常重要的是,那种可能需要“迷宫般的亮点”而不是强大的东西。

(虽然如果一直使用导航控制器,它会变得更加简单。)

答案 2 :(得分:0)

在相关的视图控制器中,您如何设置委托。

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:中查看相关的原始视图控制器,您可以检查它是否应该重置其字段