0

我有一个 TabBar 控制器,里面有一些标签栏项目。

用户第一次点击标签栏项目时,我希望打开一个警报视图,以便用户可以阅读一些小说明提示。

我有一个全局变量(比如 CONFIG),它包含一些布尔值(CONFIG.tip1AlreadySeen、CONFIG.tip1AllreadySeen 等)。所有这些布尔值都初始化为 NO。

当用户点击一个标签栏项目时,它的 viewcontroller 中的 viewWillAppear 方法被执行。在这种方法中,我放置了这样的代码:

-(void) viewVillAppear: (BOOL) animated {
    extern CONFIG; // <- it's not the actual code but it indicates that a global variable must be used

    [super viewWillAppear: animated];

    if(CONFIG.tip1AlreadySeen == NO) {
        CONFIG.tip1AlreadySeen = YES;

        // code for showing the alertview
    }    
}

奇怪的是,这段代码在一个视图控制器中可以完美运行,但不能在另一个视图控制器中运行。

通过一些调试,我发现在另一个视图控制器中执行了代码,但是分配 CONFIG.tipAlreadySeen = YES 并没有修改 CONFIG.tipAlreadySeen 的实际值。这个值仍然是 NO。难以置信的!!!

一个小解决方法是使用 viewDidAppear 方法来更改值:

-(void) viewVillAppear: (BOOL) animated {
    extern CONFIG; // <- it's not the actual code but it indicates that a global variable must be used

    [super viewWillAppear: animated];

    if(CONFIG.tip1AlreadySeen == NO) {
        // code for showing the alertview
    }    
}

-(void) viewDidAppear: (BOOL) animated {
    extern CONFIG;
    CONFIG.tip1AlreadySeen = YES;
}

...但我真的不明白发生了什么!你们当中有人可以解释这种行为吗?

提前致谢!

马可

4

1 回答 1

0

为什么这必须是全局的并且不包含在视图控制器本身中?只需在您的视图控制器上切换一个简单BOOL的@property。而且,为了在应用程序的多次运行中保持这种持久性,请将结果保存到 NSUserDefaults,然后在每次初始化视图控制器时检查它。

于 2011-11-06T11:16:28.040 回答