Iphone NSUserDefaults无法完全用于应用程序中的设置

Iphone NSUserDefaults无法完全用于应用程序中的设置,iphone,xcode,nsuserdefaults,Iphone,Xcode,Nsuserdefaults,我的应用程序中有一个设置视图,用户可以选择其中一个选项卡,显示播客的MP3提要或播客的mov。我在第一次运行该应用程序时就设置为显示一个AlertView,询问他们喜欢什么。我在ApplicationIDFinishLaunching中这样做: NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (! [defaults boolForKey:@"notFirstRun"]) { UIAlertVie

我的应用程序中有一个设置视图,用户可以选择其中一个选项卡,显示播客的MP3提要或播客的mov。我在第一次运行该应用程序时就设置为显示一个AlertView,询问他们喜欢什么。我在ApplicationIDFinishLaunching中这样做:

 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];        }

    }
在布道导航控制器的根视图(布道音频列表)上,我在视图中设置了以下内容:

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"]) {
}
我还设置了一个带有分段控件的设置选项卡,以反映所选内容。这就是问题所在:


如果我单击firstRun弹出窗口中的视频,然后直接转到“布道”选项卡,它将保持在音频布道上。然后我可以导航到“设置”选项卡,它将显示选定的视频。现在,无需选择任何内容,我可以再次转到布道选项卡,它现在将转到视频布道。为什么在我转到“设置”之后,它才收到要更改的消息?

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

视图将出现
在选择
UIAlertView
选项时,该视图将已运行

为了解决这个问题,我建议使用另一个根视图作为初始视图。如果您正在使用故事板,请将一个序列转到启动警报视图的视图控制器,另一个序列转到选项卡页面。在第一次启动时,转到警报视图页面,否则转到选项卡页面。这样,就可以在加载选项卡视图之前设置
nsserdefaults
@“videosermons”