2016-12-27 7 views
0

お互いに関連するアレイを作成するプロセスは一般的にどのようなプロセスですか?Swiftで2つのアレイを関連付ける方法

私がしようとしているのは、UITableViewに表示されるstoresitemsの2つの配列を持つシンプルショッピングリストアプリケーションを作成することです。 stores配列がメインのtableViewに表示され、items配列がstores配列の項目がタップされているときに詳細テーブルビューに表示されますが、これが通常どのように行われているか分かりません。 2次元配列(または1対多配列)の並べ替えが、私は少し混乱しています。

ここには、メインの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

あなたは何をしようとしているのか分かりませんが、 'stores'の要素がキーで、' items'のリストは値です。 – Carcigenicate

+1

[Realm](https://realm.io/docs/swift/latest/)またはコアデータを試すことができます。レルムを例として使用すると、アイテムのリストを持つストアオブジェクトを作成できます。彼らはあなたがチェックアウトできる犬と所有者の関係を使用している例があります。 – JustinM

+0

@JustinMそれは最終的に私の目標です、私はレルムを使用しますが、これはより良い理解を得るためのより簡単なステップだと思っていました。 –

答えて

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() 
     } 

さて、あなたは

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

が一緒にストアオブジェクトを開始

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

ストアモデルに項目を追加し、以下のように、そのストア内のアイテムの詳細を取得しますアイテム。

+1

デフォルトでは、オプションは 'nil'です。あなたはそれを指定する必要はありません。 – Honey

+1

そうです...それを追加する必要はありません。 – user3608500

+0

@ user3608500ありがとうございます! –

関連する問題