使用 self.window?.makeKeyAndView() 时的 EXC_BREAKPOINT

Posted

技术标签:

【中文标题】使用 self.window?.makeKeyAndView() 时的 EXC_BREAKPOINT【英文标题】:EXC_BREAKPOINT when using self.window?.makeKeyAndView() 【发布时间】:2015-01-25 12:19:35 【问题描述】:

由于某种原因,当我在 AppDelegate 中使用 self.window?.makeKeyAndView() 时,我得到了 EXC_Breakpoint。当我让 ViewController 通过 Segue 正常加载时,它不会发生。

基本上,我使用此代码的目标是在用户已经登录时跳过初始视图控制器。

AppDelegate.swift:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    if NSUserDefaults.standardUserDefaults().objectForKey("auth_token") != nil 
        self.window?.rootViewController = MainViewController()
        self.window?.makeKeyAndVisible()
    

    return true

MainViewController.swift:

这是我viewDidLoad()中的一段代码:

navTitleLabel1 = UILabel()
navTitleLabel1.frame = CGRect(x: 0, y: 8, width: wBounds, height: 20)
navTitleLabel1.text = "View 1" //TRIGGERS EXC_BREAKPOINT (EXC_ARM_BREAKPOINT)
navTitleLabel1.textColor = UIColor.whiteColor()
navTitleLabel1.textAlignment = NSTextAlignment.Center
self.navbarView.addSubview(navTitleLabel1)

navTitleLabel2 = UILabel()
navTitleLabel2.alpha = 0.0
navTitleLabel2.frame = CGRect(x: 100, y: 8, width: wBounds, height: 20)
navTitleLabel2.text = "View 2"
navTitleLabel2.textColor = UIColor.whiteColor()
navTitleLabel2.textAlignment = NSTextAlignment.Center
self.navbarView.addSubview(navTitleLabel2)

当我注释掉触发是我注释的行时,下一个等效的 View 2 字符串 1 会触发它。我不明白为什么会这样。

编辑:

我将其修复如下:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    if NSUserDefaults.standardUserDefaults().objectForKey("auth_token") != nil 
        var storyboard = UIStoryboard(name: "Main", bundle: nil)

        self.window!.rootViewController = storyboard.instantiateViewControllerWithIdentifier("MainViewController") as? UIViewController

        self.window?.makeKeyAndVisible()
    

    return true

【问题讨论】:

【参考方案1】:

您需要显示更多信息,例如堆栈跟踪和控制台中的任何其他信息。

但是在这种情况下,您的问题很清楚。当你这样做时,你通过直接初始化它来创建一个新的视图控制器 (MainViewController()),你的故事板中的任何信息都不存在,所以你所有的出口都将是 nil,因为它们是隐式展开的选项 (!)这会导致崩溃。

崩溃的解释清楚地打印在控制台中。

如果 VC 的内容是在情节提要上定义的,则必须从情节提要中加载它。使用instantiateViewControllerWithIdentifier

【讨论】:

是的,听从你的建议,我明白了。这正是问题所在。 另外,当我使用 self.window 时,我是否有任何理由不必明确说明窗口是什么! ?在该方法调用之前是否已将其初始化? 如果你有故事板,窗口会为你制作。

以上是关于使用 self.window?.makeKeyAndView() 时的 EXC_BREAKPOINT的主要内容,如果未能解决你的问题,请参考以下文章

window.parent ,window.top,window.self 详解

Js中的window.parent ,window.top,window.self 了解

创建 UIView 时,无法识别的选择器在 didFinishLaunchingWithOptions 中发送 self.window 消息

iPhone:NSLog self.window.rootviewcontroller

self window 为空,但 Window 插座已正确链接

无法在 didFinishLaunchingWithOptions 中将 UIImageView 添加到 self.window