【问题标题】:How to relate two arrays in Swift如何在 Swift 中关联两个数组
【发布时间】:2016-12-27 17:13:03
【问题描述】:

创建相互关联的数组的典型过程是什么?

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

这是我的代码,它在主 tableView 中显示 stores 数组。

商店类:

import Foundation

class Store{
    var storeName = ""
}

物品类别:

import Foundation

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

主视图控制器:

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

}

【问题讨论】:

  • 我对你想要做什么只有肤浅的了解,但这听起来像是Map 的工作,其中stores 的元素是键,@ 的列表987654333@ 是值。
  • 你可以试试Realm或者core data。以 Realm 为例,您可以拥有一个包含项目列表的商店对象。他们有一个使用狗和所有者关系的示例,您可以查看。
  • @JustinM 这最终是我的目标,我将使用 Realm,但我认为这将是一个更简单的步骤来更好地理解,我希望。

标签: ios arrays swift uitableview


【解决方案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
      }
    }
   }

【讨论】:

  • 成功了,我唯一需要更改的是将Store 类中的数组声明更改为var itemList = [Item]() 非常感谢您的帮助!
【解决方案2】:

在 Store 模型中添加商品

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

与项目一起启动 Store 对象。

【讨论】:

  • 默认选项是nil。所以你不需要指定它。
  • 是的...没有必要添加。
  • @user3608500 非常感谢!
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2021-04-22
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多