How can I group TableView items from a dictionary in swift?

后端 未结 7 1442
灰色年华
灰色年华 2020-12-12 16:44

Lets consider this example:

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 
    @IBOutlet weak var tableV         


        
相关标签:
7条回答
  • 2020-12-12 17:05

    You can use struct for that and here is example:

    import UIKit
    
    class TableViewController: UITableViewController {
    
        var names = ["Vegetables": ["Tomato", "Potato", "Lettuce"], "Fruits": ["Apple", "Banana"]]
    
        struct Objects {
    
            var sectionName : String!
            var sectionObjects : [String]!
        }
    
        var objectArray = [Objects]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            for (key, value) in names {
                println("\(key) -> \(value)")
                objectArray.append(Objects(sectionName: key, sectionObjects: value))
            }
        }
    
        // MARK: - Table view data source
    
        override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return objectArray.count
        }
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return objectArray[section].sectionObjects.count
        }
    
    
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
    
            // Configure the cell...
            cell.textLabel?.text = objectArray[indexPath.section].sectionObjects[indexPath.row]
            return cell
        }
    
        override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    
            return objectArray[section].sectionName
        }
    }
    
    0 讨论(0)
  • 2020-12-12 17:11

    An easier way to solve this problem is to copy your dictionary into a temporary variable. Use removeFirst to extract the values from the array inside the dictionary.

    var itemList=["Grocery":["soap","flour","carrots"],"Vehicles":["oil change","gas","tire rotation"],"Household":["Cable","Tv","cellphone"]]
    var itemListTmp :[String:[String]] = [:]
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
            cell.textLabel?.text=itemListTmp[keysItem[indexPath.section]]?.removeFirst()
           //cell.textLabel?.text=itemList[indexPath.section].items[indexPath.row]
            return cell
        }
    

    Another way of solving this problem is to extract keys and values in separate arrays:

    var task=[String](itemList.keys)
    var tobeDone=[[String]](itemList.values)
    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return task[section]
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    
        cell.textLabel?.text=tobeDone[indexPath.section][indexPath.row]
    
        return cell
    }
    
    0 讨论(0)
  • 2020-12-12 17:12

    Swift 2

    you dictionary example

    var dic:Dictionary<String,String> = ["key":"value","key1":"value2"]
    

    Your table

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
            let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    
        var key   = Array(self.dic.keys)[indexPath.row]
        var value = Array(self.dic.values)[indexPath.row]
        cell.text = key + value 
    }
    
    0 讨论(0)
  • 2020-12-12 17:13

    From Apple Documentation :

    var keys: LazyForwardCollection<MapCollectionView<Dictionary<Key, Value>, Key>> { get }

    Description: A collection containing just the keys of self. Keys appear in the same order as they occur as the .0 member of key-value pairs in self. Each key in the result has a unique value.

    names.keys.array returns an Array of the keys.

    SO:

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return names.keys.array[section].count
    }
    
    func sectionIndexTitlesForTableView(tableView: UITableView) -> [AnyObject]!{
    return names.keys.array
    }
    
    func tableView(tableView: UITableView,
        titleForHeaderInSection section: Int) -> String?{        
    return names.keys.array[section]
    }
    

    This will work on Any Dictionary with any amount of data(even if it is unknown to the programmer

    0 讨论(0)
  • 2020-12-12 17:15

    All collection types must be Array

    var names = [["Tomato", "Potato", "Lettuce"], ["Apple", "Banana"]]
    var sectionNames = ["Vegetables", "Fruits"]
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
      return names[section].count
    }
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int{
      return names.count
    }
    
    func sectionIndexTitlesForTableView(tableView: UITableView) -> [AnyObject]!{
    
      return sectionNames
    }
    
    func tableView(tableView: UITableView,
      titleForHeaderInSection section: Int) -> String?{
        return sectionNames[section]
    }
    
    0 讨论(0)
  • 2020-12-12 17:19

    If you want it sorted use the global sorted function to sort the dictionary.

    import UIKit
    
    class TableViewController: UITableViewController {
    
        var names = ["Vegetables": ["Tomato", "Potato", "Lettuce"], "Fruits": ["Apple", "Banana"]]
    
        var namesSorted = [String, Array<String>]()
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Sort names
            namesSorted = sorted(names) { $0.0 < $1.0} // namesSorted = ["Fruits": ["Apple", "Banana"], "Vegetables": ["Tomato", "Potato", "Lettuce"]]
    
        }
    
        // MARK: - Table view data source
    
        override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
            return namesSorted.count
        }
    
        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return namesSorted[section].1.count
        }
    
    
        override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell
    
            // Configure the cell...
            cell.textLabel?.text = namesSorted[indexPath.section].1[indexPath.row]
            return cell
        }
    
        override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    
            return namesSorted[section].0
        }
    }
    
    0 讨论(0)
提交回复
热议问题