viewController 出现时出现黑色

Posted

技术标签:

【中文标题】viewController 出现时出现黑色【英文标题】:viewController appearing black when appearing 【发布时间】:2011-11-04 19:00:08 【问题描述】:

大家好,我是 ios 开发新手,目前遇到一些问题,如果用户未登录,我正在尝试以模态方式显示登录表单。

我正在使用 NSUserDefaults 来存储一个 id,我只是检查它是否存在。如果没有,那么我希望 UIViewController 出现。

到目前为止,我的 UINavigationController 中有以下代码,它位于 UITabViewController 内,我试图让 UIViewController 出现在第一个 UINavigationController (被选择的那个)之上,此时动画正在发生但那里即使登录屏幕已经创建了所有相关的文本框等,也只是一个黑屏。如果我将此登录屏幕设置为要加载的初始视图,它会正常加载。

这是出现在 UINavigationController 的 First 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 开发非常陌生,所以如果我犯了一些错误,很高兴知道我哪里出错了。

谢谢

【问题讨论】:

确保您的 LoginViewController 的视图已连接到 XIB 文件中,在 LoginViewController 的 viewDidLoad 中设置断点并确保它正在执行您的预期。 您的登录视图是在 loadView 中实现的,还是为此设置了 nib? 我刚刚在我的 viewDidLoad 中添加了一个 NSLog,它正在按预期将其注销。 @FirozeLafeer 我在 Xcode 中使用情节提要模式,所以我在情节提要中已经有了视图。 【参考方案1】:

因此,您在此处创建的 LoginViewController 与您在情节提要中设置的实例不同。我认为您想要加载和呈现情节提要中的内容。

最简单的方法是在情节提要中创建一个从您的第一个视图控制器到您在那里创建的登录视图控制器的转场。您可以从一个视图控制器按住 ctrl 并拖动到另一个视图控制器,然后选择“模态”作为 segue 的类型。然后去找那个segue的inspector并给它一个标识符。假设您将其称为“segueToLogin”。

然后要从您的代码中执行该 segue,只需执行以下操作:

  if (![prefs stringForKey:@"id"])

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

  

希望对您有所帮助。

编辑

所以只是为了回答你的问题,想象一下:

你有一个很棒的应用程序创意,所以你从你的笔记本上拿了一张纸,然后勾勒出这个很棒的设计。然后你的同事过来,所以你撕下一张新的白纸,然后给他们看。他们不会留下深刻印象。

这里也发生了同样的事情。您在情节提要中设置了一个包含所有视图的视图控制器。但是到了展示它的时候,你取出了一个新的完全空白的视图控制器,并把它展示给用户。相反,通过拉动和启动 segue,您最终会加载您想要的实际视图控制器实例。

现在在 segues 中,您可以在情节提要中创建它们以允许用户在场景中导航。有时这些segues直接附加到按钮或其他东西上。但在这种情况下,您不想要求用户按下按钮或其他东西来呈现登录 vc,因此您自己执行 segue。

希望这是有道理的。

【讨论】:

嗨@Firoze Lafeer 非常感谢您的款待,我将您的答案勾选为正确(我希望这就是我需要做的,这是我在那里的第一篇文章)所以我应该当我创建一个与故事板上的实例不同的类似控制器时,每次想要进行推送时都执行此 performSegueWithIdentifier 操作?我仍在努力解决这一切,所以感谢您的回答真的很有帮助。 不确定我们说的是同一件事。我在回答中添加了一些内容,希望这是有道理的。【参考方案2】:

我遇到了类似的问题,但解决方案不是上面列出的解决方案。问题出在实际的新视图控制器“.m”文件中(我试图推送/模态的那个)。里面有一个名为 loadView 的方法,如果你把它留在那里,XCode 将忽略你在情节提要中拥有的 xib,并希望你布置视图。删除该函数,它将改为查看 xib。

在这个愚蠢的错误上花了太长时间,希望这可以帮助拯救别人的理智。

【讨论】:

哈,这也是我的问题。谢谢!【参考方案3】:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:YES];

【讨论】:

以上是关于viewController 出现时出现黑色的主要内容,如果未能解决你的问题,请参考以下文章

检查当前 viewController 类是不是为 IOS 7 中的 Person ViewController 时出现问题

滑动 ViewController 时出现导航栏错误

当 ViewController 有从 Xib 唤醒的视图时出现 NSUnknownKeyException [重复]

Xcode 11 Beta - Storyboard ViewControllers 出现黑色

在新 viewController 中加载 UIWebView 时出现 HTTP 错误 -999

如何从反应原生页面快速打开现有的 ViewController?