【发布时间】:2022-01-05 18:38:21
【问题描述】:
我正在构建一个内置有 2 个不同选项卡的应用程序。第一个选项卡是“Home”,它基本上有一个表格视图,其中包含从 api 配置的单元格。(api 现在让我获得国家名称) 这些单元格还有一个“星号”按钮,现在可以打印特定单元格的数据。
第二个选项卡是“已保存” 选项卡(SavedViewController),我想在其中使用表格视图显示“已加星标” 国家/地区。
您可以查看下图以了解该应用的想法。
星形按钮在我的CountriesTableViewCell中有一个功能。我正在使用 saveButtonDelegate 来让 SavedViewController 知道要保存的项目。 CountriesTableViewCell中星星按钮的代码如下。
@objc func buttonTapped() {
//If Button is selected fill the image. Else unfill it.
if !isSaveButtonSelected {
saveButton.setImage(UIImage(systemName: "star.fill"), for: .normal)
isSaveButtonSelected = true
saveButtonDelegate?.saveButtonClicked(with: countryData) //Checking if save button is clicked
}
}
countryData 是我从 api 获取的数据,这是我要传递给 SavedViewController 的数据。
struct CountryData: Codable {
let name : String
}
所以在 SavedViewController 上,我使用 SaveButtonProtocol 一致性处理数据,如下所示:
extension SavedViewController: SaveButtonProtocol {
func saveButtonClicked(with data: CountryData) {
countryDataArray.append(data)
print("saveButtonClicked")
print("countryData in savevc is \(countryDataArray)")
DispatchQueue.main.async {
self.countriesTableView.reloadData()
}
}
}
每当我单击第一个选项卡上的星形按钮时,都会在 SavedViewController 上调用此函数。所以每当我点击按钮时,上面的那些 print 语句都可以正常工作。
问题是,每当点击星形按钮时,它应该将当前点击单元格的数据附加到SavedViewController中的countryDataArray。但是数组没有按应有的方式填充。
假设我按下了第一个单元格的星号按钮,我的 print("countryData in savevc is (countryDataArray)") 语句打印:["Vatican City"],然后我按下第二个单元格的星形按钮,它只打印 ["Ethiopia"] 而它应该打印 ["Vatican City", "Ethiopia"]
为什么会出现这个问题?我最好的猜测是我将 SavedViewController 从单元类中委派,因此它对每个其他单元的行为都不同。如果是这个问题,我应该怎么解决?
非常感谢。
【问题讨论】:
-
检查是否在某处重置了 countryDataArray。还要检查委托和保存的视图控制器是否始终相同。您还应该将数据存储在一个共享(静态数组)对象中,这样您就只有一个来源,并将保存的指标添加到您的国家/地区结构中,这样您就不必依赖一个视图控制器中显示的内容。
-
难以置信的解决方案。静态数组效果很好。非常欣赏!多亏了你,学习了一个新的整体概念。如果您发布它,我可以接受您的答案。谢谢
-
重要的是定义您的模型以及从何处访问它。如果不止一处静态属性有用,因为所有视图控制器只共享一个副本。您可以在核心数据模板中看到这一点:仅共享一个数据库实例。
-
令人难以置信的概念和非常出色的解释。谢谢你开阔了我的视野!肯定会更频繁地使用静态。
标签: ios swift xcode api uitableview