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