2016-12-27 32 views
0

通常創建相互關聯的數組的過程是什麼?如何將Swift中的兩個數組聯繫起來

我想要做的是創建一個簡單的購物清單應用程序,我將有兩個數組,storesitems它將顯示在UITableView中。 stores陣列將顯示在主表格視圖中,並且當從stores陣列中輕敲一個項目時,items陣列將顯示在詳細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 
     } 
    } 
    } 

} 
+1

我只對你想要做的事情有一個粗淺的理解,但是這聽起來像是一個'Map'的工作,其中'stores'的元素是鍵,'items'的列表是值。 – Carcigenicate

+1

你可以試試[Realm](https://realm.io/docs/swift/latest/)或核心數據。以Realm爲例,您可以擁有一個包含項目列表的商店對象。他們有一個使用狗和所有者關係的例子,您可以查看。 – JustinM

+0

@JustinM這是我最終的目標,我將使用Realm,但我認爲這將是一個更簡單的步驟,希望能有更好的理解。 –

回答

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 
     } 
    } 
    } 
+0

它的工作,我唯一需要改變的是'Store'類中的數組聲明到'var itemList = [Item]()'非常感謝您的幫助!默認情況下, –

1

添加在Store模式的項目

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

啓動Store對象沿項目。

+1

optional是'nil'。所以你不需要指定它。 – Honey

+1

是的...沒有必要補充一點。 – user3608500

+0

@ user3608500非常感謝! –

相關問題