从swift文件更新时,进度条崩溃,而不是它的viewController

时间:2016-06-26 23:41:05

标签: ios swift progress-bar

我在Swift中有一个文件,可以保存我的所有查询。使用saveOperation.perRecordProgressBlock此文件保存记录时,请调用ChatView视图控制器并更新progressBarUpdate函数。

到目前为止,我可以在progressBarUpdate内获得打印以正确打印进度。但是当我更新progressBarMessage.setProgress(value!, animated: true)时,应用程序崩溃时出现以下错误:fatal error: unexpectedly found nil while unwrapping an Optional value

如果我尝试通过progressBarMessage.setProgress(value!, animated: true运行viewDidLoad),它会更新进度条,没有错误。这意味着插座工作得很好。

要考虑的其他事情是我的print(".... perRecordProgressBlock - CHAT VIEW\(value)")工作得很好。如果从Queris.swift获取更新。只是progressBarUpdate引起了问题。

@ my Queries.swift file option 1

 saveOperation.perRecordProgressBlock = { (recordID, progress) -> Void in
    print("... perRecordProgressBlock \(Float(progress))")
    var chatView = ChatView()
    chatView.progressBarUpdate(Float(progress))
 }

@ my Queries.swift文件选项2

 saveOperation.perRecordProgressBlock = { (recordID, progress) -> Void in
    print("... perRecordProgressBlock \(Float(progress))")

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let chatViewController = storyboard.instantiateViewControllerWithIdentifier("ChatViewVC") as! ChatView
    chatViewController.progressBarUpdate(Float(progress))
}

@ ChatView视图控制器

func progressBarUpdate(value: Float) 
{
    print(".... perRecordProgressBlock - CHAT VIEW\(value)")
    if (value as? Float) != nil 
    {
        progressBarMessage.setProgress(value, animated: true)
    }
}

2 个答案:

答案 0 :(得分:0)

var chatView = ChatView()

我要在这里走出去,说你正在使用故事板/ xibs。如果是这样,以上将不是实例化新视图控制器的正确方法。 Here's some information on the difference(问题涉及Objective-C,但Swift中的概念相同)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let chatViewController = storyboard.instantiateViewControllerWithIdentifier("identifier-you-set-in-storyboard") as! ChatView

identifier-you-set-in-storyboardset in the interface builder的地方(链接的问题很旧,但说明了概念,字段标签可能在较新版本中发生了变化)

如果您创建的某些机会是在代码中设置视图(而不是故事板),则需要在chatView.loadView()之前调用chatView.progressBarUpdate...。 (或者只是尝试访问view属性,它应该为您调用loadView。)

答案 1 :(得分:0)

实例化viewController的方式不正确,因此崩溃/零值。仅当某些内容向其发送viewController消息时,view才会加载其视图层次结构。当将view层次结构放在屏幕上时,系统将自行执行此操作。它会在prepareForSegue:sender:viewWillAppear:loadView()self.view等来电后发生。

所以在这里你的网点仍然是零,因为它尚未加载。

尝试强制viewController拨打self.view,然后从viewController访问这些功能。