【问题标题】:Adding a cell to another TableView. (selecting an item from a tableview, showing it in another tableview)将单元格添加到另一个 TableView。 (从 tableview 中选择一个项目,在另一个 tableview 中显示它)
【发布时间】:2022-01-05 18:38:21
【问题描述】:

我正在构建一个内置有 2 个不同选项卡的应用程序。第一个选项卡是“Home”,它基本上有一个表格视图,其中包含从 api 配置的单元格。(api 现在让我获得国家名称) 这些单元格还有一个“星号”按钮,现在可以打印特定单元格的数据。

第二个选项卡是“已保存” 选项卡(SavedViewController),我想在其中使用表格视图显示“已加星标” 国家/地区。

您可以查看下图以了解该应用的想法。

App simulation Image

星形按钮在我的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


【解决方案1】:

您应该将数据存储在一个共享(静态数组)对象中,这样您就只有一个来源,并将保存的指标添加到您的国家/地区结构中,这样您就不必依赖一个视图控制器中显示的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多