Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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
为什么更新视图时我的数组为空?(Swift)_Swift - Fatal编程技术网

为什么更新视图时我的数组为空?(Swift)

为什么更新视图时我的数组为空?(Swift),swift,Swift,在调试期间,我可以看到控制器中的fixtureList返回6个值。但是,当代码跳入视图中的fixtureView.update(…)时,fixtureList值为0 我确信这与在控制器和视图中创建相同的变量有关,但我无法理解 解决这个问题的最佳方式是什么?本质上,我希望视图接收6个值,以便填充用户界面 控制器 var fixtureList = [Fixture]() func updateScores() { liveScoreApi.fetchFixtures() { (

在调试期间,我可以看到控制器中的fixtureList返回6个值。但是,当代码跳入
视图中的
fixtureView.update(…)
时,fixtureList值为0

我确信这与在控制器和视图中创建相同的变量有关,但我无法理解

解决这个问题的最佳方式是什么?本质上,我希望
视图接收6个值,以便填充用户界面

控制器

var fixtureList = [Fixture]()

func updateScores() {
    liveScoreApi.fetchFixtures() { (
        isOK, fixture) in
        if isOK == true {
                for fixture in (fixture?.fixtures)! {
                    self.fixtureList.append(fixture)
                 }
            self.fixtureView.update(/*dump*/(self.fixtureList))
            }
        else {
            NSLog("error fetching!")
        }
    }
}
查看

class FixtureView: NSView {

@IBOutlet weak var homeNameTextField: NSTextField!
@IBOutlet weak var timeTextField: NSTextField!
@IBOutlet weak var awayNameTextField: NSTextField!

let fixtureList = [Fixture]()

func update(_ fixture: [Fixture]) {
    // do UI updates on the main thread
    DispatchQueue.main.async {
        for fixture in self.fixtureList {
                self.homeNameTextField.stringValue = fixture.homeName
                self.timeTextField.stringValue = fixture.time
                self.awayNameTextField.stringValue = fixture.awayName
                print("added \(fixture.homeName)")
            }
        }
    }
}

您的更新方法应如下所示:

//let fixtureList = [Fixture]() // you don't need this

func update(_ fixtureList: [Fixture]) {
    // do UI updates on the main thread
    DispatchQueue.main.async {
        // (though you probably don't want this ultimately)
        for fixture in fixtureList {
            self.homeNameTextField.stringValue = fixture.homeName
            self.timeTextField.stringValue = fixture.time
            self.awayNameTextField.stringValue = fixture.awayName
            print("added \(fixture.homeName)") 
        }
    }
}
问题是您正在类级别上新建一个
Fixture
对象数组。然后,在update方法中,您试图迭代新的数组,而不是传入的数组

  • 只需在类级别消除不必要的数组
  • 将参数名称更改为
    fixtureList
  • 从您的for in循环中的
    fixtureList
    中删除
    self.

如果在DispatchQueue上中断,fixture参数是否也为空?您不应该迭代该值吗?在DispatchQueue中添加了break-
fixture
有6个值。你可能是对的,事实上,我该如何实现这一点?啊,是的,那太完美了。干杯有道理。可能是一个单独的问题,但你知道为什么UI上只显示
fixtureList
中的最后一个值吗?哦,是的,当然。所以想想这个for循环在做什么。每次迭代时,它都会将您的三个标签设置为当前迭代的值,而不是写入前一个值。因此,很自然,无论最后一个值是什么,都将是您看到的唯一内容。让我知道这是否合理@bazeOf当然,是的,就是这样。我将尝试解决这个问题。尽管我删除了循环,但要访问homeName,例如,我需要指定一个索引:
self.homeNameTextField.stringValue=fixtureList[1]。homeName
。但是我想更新所有的域名,而不仅仅是
[1]
@baze您应该在这种情况下使用表视图吗?如果您觉得自己在正确的路径上,那么可以得到如下迭代器:可能是的,听起来这可能更合适。虽然我不确定!我正在创建一个菜单栏应用程序,目前有这3个标签。谢谢,我去看看