当视图控制器出现时,出现黑屏

8

大家好,我刚开始学习iOS开发,目前遇到了一个问题。我想在用户未登录时让登录表单以模态形式出现。

我使用NSUserDefaults来存储用户的id,并简单地检查它是否存在。如果不存在,则希望UIViewController出现。

目前,我在UITabViewController中的UINavigationController中有以下代码。我试图让UIViewController显示在第一个UINavigationController(即所选的导航控制器)上方。目前,动画正在进行中,但是只出现了黑色屏幕,即使Login屏幕已经创建了所有相关文本框等组件。如果将此登录屏幕设置为要加载的初始视图,则可以正常加载。

下面是出现在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开发非常陌生,如果我犯了一些错误,知道我错在哪里会很好。谢谢。

1
确保你的LoginViewController视图在XIB文件中已连接,设置一个断点在LoginViewController的viewDidLoad方法中,并确保它正在按照你的预期执行。 - logancautrell
你的登录视图是在loadView中实现还是已经为此设置了一个nib文件? - Firoze Lafeer
我刚在viewDidLoad中添加了一个NSLog,它已经按预期输出日志。@FirozeLafeer,我在Xcode中使用Storyboard模式,因此视图已经在Storyboard中。 - Dan Newns
3个回答

7
所以,在这里创建的LoginViewController与你在故事板中设置的不同。我认为你想要加载并呈现故事板中的那一个。
最简单的方法是在故事板中从第一个视图控制器创建到你创建的登录视图控制器之间创建一个segue。你可以从一个视图控制器拖动到另一个视图控制器,然后选择“Modal”作为segue的类型。然后进入该segue的检查器,并给它一个标识符。假设你称其为“segueToLogin”。
然后要执行从代码中的segue只需要像这样做:
  if (![prefs stringForKey:@"id"]){

    [self performSegueWithIdentifier:@"segueToLogin" sender:self];

  }

希望能够帮到您。

编辑

为了回答您的问题,想象一下:

您有一个非常棒的应用程序想法,于是您从翻页上拿出一张纸,并画出这个伟大的设计。然后您的同事过来看,于是您撕下一张新的空白纸,并向他们展示。但他们不会感到惊讶。

这里发生了同样的事情。您在故事板中设置了一个视图控制器,其中包含所有视图。但是当显示它的时候,您却拿出了一个全新的完全空白的视图控制器,而不是原来想要的那个实例。通过拉动并激活segue,您最终加载了实际想要的视图控制器实例。

现在让我们谈一谈segue。在故事板中创建segue,允许用户浏览场景。有时这些segue直接附加到按钮或其他东西上。但在这种情况下,您不想要求用户按下按钮或其他东西来呈现登录vc,因此您正在自己执行segue。

希望这样说得清楚。


嗨@Firoze Lafeer,非常感谢您的帮助,它完美地解决了我的问题。我已经将您的答案标记为正确(希望这就是我需要做的,因为这是我在那里发布的第一篇文章)。所以,当我创建一个与故事板上不同实例的类似控制器时,我是否应该每次都执行performSegueWithIdentifier操作来进行推送或模态呢?我仍在努力理解这一切,所以感谢您的回答,真的很有帮助。 - Dan Newns
不确定我们在说同一件事情。我在我的回答中添加了一点内容,希望这样说得通。 - Firoze Lafeer

3
我遇到了类似的问题,但解决方法不同于上述方法。问题出在新视图控制器的“.m”文件中(我试图推送/模态显示该文件)。里面有一个名为loadView的方法,如果你把它留在那里,XCode将忽略故事板中的xib文件,并期望你布置视图。移除该函数后,它将查看xib文件。这个愚蠢的错误让我浪费了太长时间,希望这可以帮助拯救其他人的理智。

哈,这也是我的问题。谢谢! - Finster

0
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:YES];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接