Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift3 如何使用stringValue多次写入IBOutlet标签_Swift3 - Fatal编程技术网

Swift3 如何使用stringValue多次写入IBOutlet标签

Swift3 如何使用stringValue多次写入IBOutlet标签,swift3,Swift3,我不熟悉编程和Swift! 我写了一个从网站下载数据的小程序。它有几个阶段来报告进度(下载、解压缩、清理csv文件、加载阵列和保存)。由于文件很大,我有一个报告进度的标签。程序运行正常(模型) 当我在updateUI函数中使用stringValue更新标签时,问题来自ViewController。 程序崩溃了,我得到了错误。在调试器中,我注意到 statusLabel.stringValue为零。 但是,崩溃不会在启动时发生,而是在operationStatus变量更新时发生。 我猜问题与可选有

我不熟悉编程和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在启动时被正确设置为“导入状态”。然后,我一单击“导入”按钮,它就被设置为零。我看到过一些关于这个问题的帖子。这可能是一个问题。我正在朝那个方向看。