在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 等,因此您只需要更新产品模型,您就可以从产品模型数组中获取设置值。