IBOutlet 等于 nil

IBOutlet equals nil

我刚刚尝试将我的 UIWebView 与 UIViewController 连接,当我启动应用程序时出现错误,这意味着 UIWebView 等于 nil。可能是什么问题?

如果您只是引用了 AuthViewController(),但根本没有引用故事板,您就会看到这种行为。那是因为当你简单地创建一个 AuthViewController 的实例时,它无法知道 class 与故事板中的哪个场景相关联。因此,所有 IBOutlet 引用都将是 nil.

相反,如果您以编程方式过渡到此场景,则可以使用其 "storyboard ID":

实例化视图控制器
  1. 在 Interface Builder 右侧面板的 "Identity Inspector" 中指定视图控制器场景的故事板 ID:

  2. 一旦你这样做了,而不是像下面那样做,那是行不通的:

    let controller = AuthViewController()
    // now do something with `controller`, e.g.
    presentViewController(controller, animated: true, completion: nil)
    

    您现在可以使用故事板 ID 正确实例化此 AuthViewController

    let controller = storyboard?.instantiateViewControllerWithIdentifier("AuthScene")
    presentViewController(controller!, animated: true, completion: nil)
    

或者,如果你想在两个场景之间转换,我更喜欢使用故事板 segues:

  1. 因此,通过control-从原始场景上方的视图控制器图标拖动到目标场景,在两个场景之间创建转场:

    这会创建一个未链接到任何按钮或类似内容的转场。它只是两个场景之间的直接连接,除非您以编程方式调用,否则不会被调用。

  2. 给那个 segue 自己的故事板 ID:

  3. 现在您可以以编程方式执行该 segue:

    performSegueWithIdentifier("TransitionToAuthScene", sender: self)
    

后一种方法的优势在于:(a) 故事板现在可以直观地表示您的应用程序流程; (b) 你可以使用 unwind segues 之类的。

--

一些最后的想法:

  • 如果您没有以编程方式过渡到这个场景,另一种可能是您没有在 Interface Builder 中连接 IBOutlet。鉴于 "Auth Web View" 标签出现在文档大纲中,我认为您确实成功连接了 IBOutlet,但这是另一回事要检查。您可以通过选择 Web 视图然后查看 Interface Builder 右侧的 "Connections Inspector" 面板来确认这一点:

  • 您稍后在评论中提到了在 viewDidLoad 中执行此转换。从故事板过渡到新场景总是错误的地方,因为您经常会在过渡到相关场景的过程中,iOS 会感到困惑。

    最好将此类代码推迟到 viewDidAppear(或跳过 "source" 视图控制器并直接过渡到此 "auth" 场景)。