大家好我不熟悉iOS开发,目前我遇到了一些问题,如果用户没有登录,我正试图以模态方式显示登录表单。
我正在使用NSUserDefaults存储一个id,我只是检查它是否存在。如果它没有,那么我希望UIViewController出现。
到目前为止,我的UINavigationController中有以下代码,它位于UITabViewController中,我正在尝试让UIViewController出现在第一个UINavigationController(被选中的那个)上方,此时动画正在发生但是那里即使登录屏幕已经创建了所有相关的文本框等,它也只是一个黑屏。如果我将此登录屏幕设置为要加载的初始视图,则会加载正常。
这是出现在UINavigationController的第一个viewcontroller中的代码。
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
if (![prefs stringForKey:@"id"]){
LoginViewController *loginController = [[LoginViewController alloc] init];
[self presentModalViewController:loginController animated:YES];
} else {
[self loadCoffeeUserOrders:[prefs stringForKey:@"id"]];
}
模态视图正在加载,但此刻它只是显示为黑色,我尝试创建一个新的登录屏幕,同样的事情发生了:只有一个黑屏。
希望有足够的信息让某人了解可能发生的事情,我对iOS开发非常陌生,所以如果我犯了一些错误,那么知道我哪里出错了会很好。
谢谢
答案 0 :(得分:7)
因此,您在此处创建的LoginViewController与您在故事板中设置的实例不同。我想你想要加载和呈现故事板中的那个。
最简单的方法是在故事板中创建一个segue,从第一个视图控制器到您在那里创建的登录视图控制器。您可以从一个视图控制器按住Ctrl键拖动到另一个视图控制器,然后选择“模态”作为segue的类型。然后转到该segue的检查员并给它一个标识符。假设您将其称为“segueToLogin”。
然后从你的代码执行segue只需执行以下操作:
if (![prefs stringForKey:@"id"]){
[self performSegueWithIdentifier:@"segueToLogin" sender:self];
}
希望有所帮助。
修改强>
所以只是回答你的问题,想象一下:
你对这个应用程序有这个好主意,所以你从你的垫子上取下一张纸,然后勾勒出这个伟大的设计。然后你的同事过来,所以你撕下一张新的空白纸,然后向他们展示。他们不会留下深刻的印象。
这里发生了同样的事情。您在故事板中设置了包含所有视图的视图控制器。但是当它到了显示它的时候,你拿出一个新的完全空白的视图控制器并向用户显示。通过拉动和启动segue,您最终会加载所需的实际视图控制器实例。
现在,在segues上,您可以在故事板中创建这些内容,以允许用户在场景中导航。有时这些segue直接连接到按钮或其他东西。但在这种情况下,您不希望要求用户按下按钮或其他内容来显示登录vc,因此您自己正在执行segue。
希望这是有道理的。
答案 1 :(得分:3)
我有类似的问题,但决议不是上面列出的那个。问题出现在实际的新视图控制器“.m”文件中(我正在尝试推送/模态打开的文件)。里面有一个叫做loadView的方法,如果你把它留在那里,XCode会忽略你在故事板中的xib,并期望你布局视图。删除该功能,它将改为查看xib。
在这个愚蠢的错误上花了太长时间,希望这可以帮助拯救别人的理智。
答案 2 :(得分:0)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:YES];