在简单的ViewController的viewWillAppear中崩溃

时间:2017-07-27 00:42:09

标签: ios swift

我在最后列出了一个非常简单的视图控制器。

目前该行titleLabel.text = alertTitle

随机崩溃(过去24小时内约有9次,此版本有20,000名每日活跃用户)

导致这种情况发生的原因是,是因为titleLabel上的弱引用?

class AlertViewController: UIViewController {

@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var cosmosStarRating: CosmosView!
@IBOutlet weak var alertLabel: UILabel!

var alertText = ""
var alertTitle = ""
var showStars = false

var appear: () -> () = {}
var disappear: () -> () = {}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    titleLabel.text = alertTitle
    alertLabel.text = alertText
    if (!showStars) {
        cosmosStarRating.removeFromSuperview()
    }
    appear()
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    disappear()
}
}

2 个答案:

答案 0 :(得分:1)

首先应该包含符号化的崩溃报告。

但试试这个:

AppDelegate文件中,删除(或注释掉)顶部显示的行:

@UIApplicationMain

然后使用以下代码将main.swift文件添加到项目中:

import UIKit

UIApplicationMain(CommandLine.argc, UnsafeMutableRawPointer(CommandLine.unsafeArgv).bindMemory(to: UnsafeMutablePointer<Int8>.self, capacity: Int(CommandLine.argc)), nil, NSStringFromClass(AppDelegate.self)) // Rename AppDelegate.self as required

我知道这可能听起来很疯狂,但它只是解决了一次与你的撞击完全相同的情况,因为我在战斗了几个星期。我收到了数百份不同版本的崩溃报告(使用TestFlight的beta测试人员),他们都指向同一个ViewController文件,并且同一行。这条线正在做什么并不重要。我重新安排了改变命令的命令,我甚至在某一点上评论了整个班级!相同的崩溃报告,相同的文件,同一行。

我交换使用上面的main.swift文件而不是自动生成的文件,瞧,崩溃报告开始有意义,指向UIApplicationMain()行,因为崩溃发生在其中一个Apple的框架(这是我的错误,但崩溃没有出现在我的代码中,它在Apple触发崩溃之前就上升了)。但是只有在切换到main.swift代码之后我才能解决这个问题。我猜在使用@UIApplicationMain方法时,符号化中存在一些错误。

答案 1 :(得分:0)

听起来viewcontroller titleLabel实例在调用ViewWillappear方法后正在初始化。并且您正在尝试访问内部ViewWillappear方法,并且如果它是nil则强制解包,那么如果尝试访问它将崩溃。您可以尝试这样宣布您的插座可选

  

@IBOutlet weak var titleLabel: UILabel?

或在ViewDidAppear方法中移动代码以防止崩溃。