NSUserDefaults不完全适用于应用程序中的设置

时间:2012-06-23 23:22:00

标签: iphone xcode nsuserdefaults

我的应用程序中有一个设置视图,可以让用户选择其中一个标签,显示来自播客的mp3或来自播客的mov。我在第一次运行应用程序时设置它以显示AlertView询问他们喜欢什么。我在applicationDidFinishLaunching中使用它来做到这一点:

 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (! [defaults boolForKey:@"notFirstRun"]) {
    UIAlertView *firstrun = [[UIAlertView alloc] initWithTitle:@"Sermon Preference" message:@"Do you prefer audio only, or video sermons?  (This setting can be changed at any time in the Settings Page.)" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Audio", @"Video", nil];
    [firstrun show];
    [firstrun release];
    [defaults setBool:YES forKey:@"notFirstRun"];
}

然后我在AppDelegate中设置它

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0)       {   
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *nope = @"Audio";
        [defaults setObject:nope forKey:@"videosermons"];
        [defaults synchronize];


    }
    if (buttonIndex == 1)        {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *yup = @"Video";
        [defaults setObject:yup forKey:@"videosermons"];
        [defaults synchronize];        }

    }

在布道导航控制器的根视图(这是布道的音频列表)中我在viewWillAppear中设置了这个:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];


NSString *currently = [defaults objectForKey:@"videosermons"];
if ([currently isEqualToString:@"Video"]) {
    self.videoView = [[[VideoPodcastTableView alloc] initWithNibName:@"VideoPodcastTableView" bundle:[NSBundle mainBundle]] autorelease];


    [self.navigationController pushViewController:_videoView animated:NO];    }
if ([currently isEqualToString:@"Audio"]) {
}

我还设置了一个带有segmentControl的“设置”选项卡,以反映已选择的内容。这就是问题所在:

如果我在firstRun弹出窗口中单击Video,然后直接进入Sermons选项卡,它将保留在Audio Sermons上。然后,我可以导航到“设置”选项卡,它将显示“已选择视频”。现在,在没有选择任何内容的情况下,我可以再次访问“布道”选项卡,现在它将转到视频讲道。为什么在我进入设置之后才会改变消息?

1 个答案:

答案 0 :(得分:0)

问题是您在调用UIAlertView clickedButtonAtIndex:选择器之前已经加载了根视图。在AppDelegate中启动UIAlertView后,您的应用程序将继续在后台加载根视图。

viewWillAppear已经在选择UIAlertView选项时运行。

要解决此问题,我建议您使用另一个根视图作为初始视图。如果您正在使用故事板,请将一个segue转到启动警报视图的视图控制器,并将另一个segue转到您的标签页。首次启动时,请转到警报视图页面,否则将转到标签页。这样,您可以在加载标签视图之前设置NSUserDefaults @"videosermons"密钥。