如何在Swift中关联两个数组

时间:2016-12-27 17:13:04

标签: ios arrays swift uitableview

创建彼此相关的数组的过程通常是什么?

我要做的是创建一个简单的购物列表应用程序,我将有两个数组storesitems,它们将显示在UITableView中。 stores数组将显示在主tableView中,当items数组中的项目被点击时,stores数组将显示在详细的tableView中,但我不知道如何这通常是完成的,我假设我需要某种二维数组(或一对多数组),但我有点困惑。

以下是我在主tableView中显示stores数组的代码。

商店类:

import Foundation

class Store{
    var storeName = ""
}

项目类别:

import Foundation

class Item : Object{
    var itemName: String = ""
    var price: Double = 0
}

主ViewController:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var storesTable: UITableView!
    @IBOutlet weak var inputStoreName: UITextField!

    var itemList = [Item]() // I'm not sure how to use this array
    var storeList = [Store]()

    override func viewDidLoad() {
        super.viewDidLoad()
       storesTable.dataSource = self
       storesTable.delegate = self
    }
    @IBAction func addNewStore() {
        let store =  Store()
        store.storeName =  inputStoreName.text!
        storeList.append(store)
        storesTable.reloadData()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return storeList.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell =  tableView.dequeueReusableCell(withIdentifier: "myCustomCell")! as UITableViewCell
        let data  =  storeList[indexPath.row]
        cell.textLabel?.text = "\(data.storeName)"
        return cell
    }

   override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "detailTableView"{
      if let destination = segue.destination as? DetailTableViewController{

          let selectedStore = storeList[(storesTable.indexPathForSelectedRow?.row)!].storeName
        destination.messageFromMainController = selectedStore
      }
    }
   }

}

2 个答案:

答案 0 :(得分:1)

实际上您需要在模型类中进行更改:

商店类:

class Store{
    var storeName = ""
    var itemList : Array<Item>? = []
}

现在,当您添加新商店时,您将使用名称添加此商店的商品。

 @IBAction func addNewStore() {
            let store =  Store()
            let item1 = Item()
            item1.itemName = "FirstStoreFirstItem"
            item1.price = "100"
            let item2 = Item()
            item2.itemName = "FirstStoreSecondtItem"
            item2.price = "200"
            store.storeName =  inputStoreName.text!
            store.itemList.append(item1)
            store.itemList.append(item2)
            storeList.append(store)
            storesTable.reloadData()
        }

现在,当您选择任何商店时,您将获得该商店中商品的详细信息,如下所示

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
   if segue.identifier == "detailTableView"{
      if let destination = segue.destination as? DetailTableViewController{

          let selectedStore = storeList[(storesTable.indexPathForSelectedRow?.row)!]
         print(selectedStore.storeName)
         print(selectedStore.itemList[0].itemName)
         print(selectedStore.itemList[0].price)
        destination.messageFromMainController = selectedStore
      }
    }
   }

答案 1 :(得分:1)

在商店模型中添加商品

class Store{
var storeName = ""
var items:[Item]? = nil
}

启动商店对象以及商品。