Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在选项卡栏控制器前显示登录屏幕_Iphone_Cocoa Touch_Ios - Fatal编程技术网

Iphone 在选项卡栏控制器前显示登录屏幕

Iphone 在选项卡栏控制器前显示登录屏幕,iphone,cocoa-touch,ios,Iphone,Cocoa Touch,Ios,我正在做一个Twitter应用程序,在AppDelegate-didFinishLaunchingWithOptions上,如果该对象上的NSUserDefaults为空,我将使用下一个代码加载登录视图: NSUserDefaults*prefs=[NSUserDefaults standardUserDefaults] NSString *test = [prefs objectForKey:@"username"]; if (test == @"(null)" || test == nil)

我正在做一个Twitter应用程序,在AppDelegate
-didFinishLaunchingWithOptions
上,如果该对象上的NSUserDefaults为空,我将使用下一个代码加载登录视图:

NSUserDefaults*prefs=[NSUserDefaults standardUserDefaults]

NSString *test = [prefs objectForKey:@"username"];
if (test == @"(null)" || test == nil) {
    LoginScreenViewController *login = [[LoginScreenViewController alloc] initWithNibName:@"LoginScreenViewController" bundle:nil];
    [self.window addSubview:login.view];
    [self.window makeKeyAndVisible];

} else {
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
}

我可以加载登录视图,但是我怎么才能取消它呢?登录屏幕必须在加载tabBarController之前显示,因此当登录控制器完成时,tab bar控制器将启动,就好像它之前没有任何其他视图一样。提前谢谢

如果用户登录或未登录,您可以加载相同的选项卡栏(if语句的第二部分)

如果用户未登录,则可以将LoginScreenViewController显示为模式视图控制器。这将位于选项卡栏控制器的上方

差不多

[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];

NSString *test = [prefs objectForKey:@"username"];
if (test == @"(null)" || test == nil) {
    LoginScreenViewController *login = [[LoginScreenViewController alloc] initWithNibName:@"LoginScreenViewController" bundle:nil];
    [tabBarController presentModalViewController:login animated:YES];
}

我不确定这是否能解决您的问题,但不要使用==进行字符串比较。使用
NSString
类的
compare:
方法

if ([myNSStringObject compare:anotherNSStringObject] == NSOrderedSame) {
   //proceed with processing based on resultant matched strings
}
else {
   //proceed with processing based on resultant non-matched strings
}

不确定这是否会产生影响,但随着您的程序变得更加复杂,如果不这样做,您可能会遇到麻烦。

登录完成后,调用:

[login.view removeFromSuperview];
[self.window addSubview:tabBarController.view];

应该只有一个UIView属于添加到窗口的UIViewController,但如果删除该视图,则可以添加另一个视图。

可以将loginview显示为模型弹出窗口。 这就是我正在做的

      loginView = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];
 UINavigationController* nav = (UINavigationController*)[tabBarController.viewControllers objectAtIndex:0]; 
loginView.navC = nav; [nav presentModalViewController:loginView animated:YES];

if(test==nil)
应该是一个充分的测试,
test==@“(null)”
是一个将为false的直接指针比较。如果您想要一个与nil不同的null,请使用
[NSNull null]
进行赋值和比较。谢谢您的建议!行!不要将用户凭据存储在NSUserDefaults中,如果要持久化凭据,则应使用keychain服务。@Flash84x可以,谢谢您的建议:)GitHub上有一个非常不错的开源keychain服务包装器,下面是一篇关于它的博客文章。我建议使用它来减少开发时间。这是可行的,但是tabBarController是在登录视图之前加载的。我认为这可以通过使用任何回调来解决,以了解登录视图是否已被取消,但我不知道如何在FirstViewController上调用重载函数,因为我尝试了
[self.parentViewController updateStream:nil]
[FirstViewController updateStream:nil](其中updateStream是一个iAction),两者都给了我一个sigabti,我在点击登录后得到了一个白色屏幕:(为什么不甚至[someString IsequalString:anotherString]?)更简化了这一点