如何使用同一模型对象在视图控制器之间传递模型数据



在ViewController A(ParameterViewController(中,我创建了一个Parameter Model,其中包含以下内容:

Parameter(name: "Alkalinity", symbol: "Kh", productName: ["item one", "item two", "item three"])

视图控制器 A 显示集合视图单元格,并在单元格中使用参数名称和符号。当用户点击单元格(碱度(时,我想将 productName 数组传递给查看控制器 B。

我想我的模型中可能有问题,但这是我到目前为止所做的。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let productViewController = segue.destination as? ProductSelectionViewController else {
fatalError()
}
if segue.identifier == productSegueIdentifier {
if let indexPaths = collectionView.indexPathsForSelectedItems {
let indexPath = indexPaths[0]
let productList = parameters[indexPath.item] as Parameter
print("The Product List Is: (productList)")
let productNames: [String] = productList.productName
print("The Product Names are (productNames)")
productViewController.products = productNames
}
}
}

视图控制器 B (ProductViewController( 如下所示。

class ProductSelectionViewController: UITableViewController {
var products = [String]()
let identifier = "ProductCell"
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .never
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return products.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
let productItem = products[indexPath.row]
cell.textLabel?.text = productItem
return cell
}

我觉得既然我宣布产品是[String],那就是可怕的架构。当我将其声明为参数时,出现错误,无法将参数分配给字符串类型

您可以通过创建模型来解决问题,如下所示:

struct Parameter {
var name : String
var symbol: String
var productsName: [ProductsName]
}
struct ProductsName {
var productName: String
}

创建两个模型,其中第一个用于参数模型,第二个用于产品名称列表。

然后在将您的参数作为产品传递后,不需要可怕的架构。

ViewController A中,更新以下代码行:

let productNames: [ProductsName] = productList.productsName

ViewController B中,更新以下代码行:

var products = [ProductsName]()

然后在访问名称之后:

products[indexPath.row].productName 

我希望这将是您正在寻找的解决方案。

我们应该避免在模型中创建字符串数组,因为它们将来无法扩展。而是创建模型参数,例如

struct Paramerter {
name: String?
symbol: String?
products: [Product]?
}
struct Product {
name: String?
}

现在,将视图控制器 A 中的参数模型初始化为

let product1 = Product(name:"item one")
let product2 = Product(name:"item two")
let product3 = Product(name:"item three")
Parameter(name: "Alkalinity", symbol: "Kh", products: [product1, product2, product3])

您的 segue 方法将保持不变。视图控制器 B (ProductViewController( 看起来像

class ProductSelectionViewController: UITableViewController {
var products: [Product]?
let identifier = "ProductCell"
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .never
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return products?.count ?? 0
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
let productItem = products[indexPath.row]
cell.textLabel?.text = productItem?.name
return cell
}
}

现在您的产品模型是完全可扩展的,如果将来需要添加更多项目,如产品描述、产品 ID 等,因此您只需要更新产品模型,您就可以从产品模型数组中获取设置值。

最新更新