Swift3 如何使用stringValue多次写入IBOutlet标签
我不熟悉编程和Swift! 我写了一个从网站下载数据的小程序。它有几个阶段来报告进度(下载、解压缩、清理csv文件、加载阵列和保存)。由于文件很大,我有一个报告进度的标签。程序运行正常(模型) 当我在updateUI函数中使用stringValue更新标签时,问题来自ViewController。 程序崩溃了,我得到了错误。在调试器中,我注意到 statusLabel.stringValue为零。 但是,崩溃不会在启动时发生,而是在operationStatus变量更新时发生。 我猜问题与可选有关,但我不明白为什么,因为我写了标签。 欢迎任何帮助/解决方案。谢谢Swift3 如何使用stringValue多次写入IBOutlet标签,swift3,Swift3,我不熟悉编程和Swift! 我写了一个从网站下载数据的小程序。它有几个阶段来报告进度(下载、解压缩、清理csv文件、加载阵列和保存)。由于文件很大,我有一个报告进度的标签。程序运行正常(模型) 当我在updateUI函数中使用stringValue更新标签时,问题来自ViewController。 程序崩溃了,我得到了错误。在调试器中,我注意到 statusLabel.stringValue为零。 但是,崩溃不会在启动时发生,而是在operationStatus变量更新时发生。 我猜问题与可选有
import Cocoa
class ViewController: NSViewController {
// this variable monitors the status of the import
var operationStatus: String = "import status" {
didSet {
updateUI()
}
}
// L 2008 - 2017 label
//@IBOutlet weak var l2008Label: NSTextField!
@IBOutlet weak var L2008: NSTextField!
// import status label
@IBOutlet weak var statusLabel: NSTextField!{
didSet {
updateUI()
}
}
// Import button
@IBAction func importButton(_ sender: NSButton) {
DataImport().importL2008()
}
// this method updates the import status Label
private func updateUI() {
statusLabel.stringValue = operationStatus
}
}
更新:将stringValue之后的问题标题从“线程1:EXC_BAD_指令(代码=EXC_1386_INVOP,子代码=0x0)”更改为“如何使用stringValue多次写入IBOutlet标签”。
如果我的理解是正确的,那么在编写stringValue之后,它似乎被设置为Nil。因此,当程序第二次尝试更改标签时,我得到了错误。对可选变量的赋值将在执行实际赋值之前对变量进行“静默”读取 如果statusLabel变量未正确连接到IB中的视图控制器,则在引用该变量之前(即使仅用于赋值),不会出现错误。这将是第一件要验证的事情(IB出口链接)
顺便说一句,statusLabel变量上的didSet不会通过更改stringValue触发,但它可能会在建立出口链接时由控制器的初始化触发(如果出口未连接,您不会注意到).您是否检查了从statusLabel didSet方法调用updateUI后是否有无限循环(当您更改操作状态时,updateUI本身会调用该方法)?您可能在创建
statusLabel
之前更新了stringValue。您可以尝试在updateUI
中执行以下操作:statusLabel?.stringValue=operationStatus
。您可能还需要在viewDidLoad()
中调用updateUI
。@matsoftware/yes我检查了无限循环。我在整个程序中添加了几个打印调试点来验证。@Ozgur我对statusLabel?.stringValue做了更改。程序不再崩溃,但标签没有改变(statusLabel仍然为零)。我处于学习模式。我也不太确定我是否理解你关于“沉默”的帖子和你的最后一段。关于连接,连接检查器似乎正确引用了statusLabel。这就是你的意思吗?我的意思是,为了将一个值设置为statusLabel.stringValue,程序需要找到已经存在的值的内存位置和内容。如果statusLabel为nil(并且您没有通过添加指定展开是可选的),那么它将无法达到stringValue属性。然而奇怪的是,这通常会产生不同的错误消息。这是值得检查的。好的,我明白你的意思。奇怪的是status.label在启动时被正确设置为“导入状态”。然后,我一单击“导入”按钮,它就被设置为零。我看到过一些关于这个问题的帖子。这可能是一个问题。我正在朝那个方向看。