NSUserDefaults 问题(如何在启动应用程序时在需要时打开不同的 viewController)

Posted

技术标签:

【中文标题】NSUserDefaults 问题(如何在启动应用程序时在需要时打开不同的 viewController)【英文标题】:NSUserDefaults Question (how do i open a different viewController when needed while starting the app) 【发布时间】:2011-07-19 12:28:19 【问题描述】:

当 NSUserDefaults 中的 BOOL 未设置时,我正在尝试启动不同的 ViewController。 加载“RegistreerView”时屏幕保持白色?我做错了什么?启动应用程序时如何启动不同的 ViewController。

我使用以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
BOOL *geregistreerd = [defaults objectForKey:@"geregistreerd"];
if(geregistreerd)
    self.window.rootViewController = self.viewController;
 else 
    self.window.rootViewController = self.registreerView;


[self.window makeKeyAndVisible];

return YES;

【问题讨论】:

您是否在此代码之前实例化reistreerView 对不起,我是 xcode 的新手,所以我不太清楚你的意思。在委托头文件中,我设置了它(也作为属性)。我做了@synthesize。就像一个标准的 Delegate 类在我创建一个新项目时初始化他的 viewController.. 【参考方案1】:

理论上你可能没有实例化你的笔尖,因为我在上面创建它的这个方法中看不到任何地方。如果没有,您可以尝试以下方法:

SomeView *yourView = [[SomeView alloc] initWithName:@"YourViewController" bundle:nil];
self.window.rootViewController = yourView;
[yourView release];

SomeViewYourViewController 替换为适当的名称。

【讨论】:

【参考方案2】:

您在NSUserDefaults 中检索BOOL 的方式不正确。你应该使用-(BOOL)boolForKey:(NSString *)defaultName;。此外,您将 geregistreerd 声明为指向 BOOL (BOOL *) 的指针,您应该在其中声明 BOOL,因此这可能会导致未定义的行为。 为了显示您想要的视图控制器,请确保它们已正确初始化/分配,或正确连接到 NIB 中的用户界面。

【讨论】:

【参考方案3】:

objectForKey 返回存储在 plist 中的字符串值。您需要将字符串转换为布尔值。

BOOL *geregistreerd = [[defaults objectForKey:@"geregistreerd"] boolValue];

【讨论】:

ok thnx,但这并不能解决我的问题,即使删除整个 if/else 语句并执行 self.window.rootViewController = self.registreerView;屏幕保持白色【参考方案4】:

根据您的评论,您尚未初始化 registreerView 变量。实际上,应用程序委托中的 viewController 是通过 nib 文件初始化的。所以,初始化registreerView 变量。

else 部分应该是:

else 
    RegistreerView *registreerView = [[RegistreerView alloc] initWibNibname:@"" bundle:nil];
    self.registreerView = registreerView;
    [registreerView release];
    self.window.rootViewController = self.registreerView;

给出适当的笔尖名称。否则将其设为 nil。

【讨论】:

以上是关于NSUserDefaults 问题(如何在启动应用程序时在需要时打开不同的 viewController)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSUserdefaults 为每个启动的对象创建一个密钥

xcode swift:NSUserDefaults:如果退出应用程序,则保存高分并在停止的地方重新启动它

如何重新启动应用程序上的所有数据? [复制]

如何将 Touch ID 与 NSUserDefaults 结合使用?

为啥我的 NSUserDefaults 无法加载?

NSUserDefaults setObject:forKey 死锁?