如何在字典中显示数组 - Swift

时间:2016-05-26 11:17:12

标签: ios arrays swift dictionary

我开始编程Swift我有一个问题,我不知道如何解决。

我制作了 Plist文件

        <dict>
<key>Vegetables</key>
<array>
    <string>Pepper</string>
    <string>Tomato</string>
    <string>Cucumber</string>
</array>
<key>Fruits</key>
<array>
    <string>Apple</string>
    <string>Banana</string>
    <string>Watermelon</string>
</array>
       </dict>       

现在我要在TableView的根目录(Dictionary)中显示所有数组(水果和蔬菜),以便每个数组名称(Key)都是独立的  Section和每个String在我的TableView中都是一行。

这里是我的视图控制器类:

    import UIKit
    //I add TableView methods

    class ViewController : UIViewController , UITableViewDelegate ,UITableViewDataSource {

    override func viewDidLoad(){            
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {

   // return number of section in my case it's two section (fruits and vegetables)
       return 1;
     }

     func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     // number of row in every section is three
     // I want to do something like Array.count
     return 1;
     }
     func tableView(tableView: UITableView, cellForRowAtIndexPath  indexPath: NSIndexPath) -> UITableViewCell {

     let row : UITableViewCell = UITableViewCell();
     //Add every Row
     return row;       
     }

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    // Here i want to add header to every section i made;
    // Header Name =  Array (key) Fruit/Vegetables
    // How i do this ? 
    return "";
     } 
     func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
      }
      }

2 个答案:

答案 0 :(得分:2)

字典不适合作为表视图的数据源,因为它们是无序的。我建议你创建一个包含你的部分的外部数组。对于每个部分,添加包含标题和项目数组的字典。

或者,您可以创建一个具有标题和项目条目的自定义部分结构,并创建一个部分结构数组。

答案 1 :(得分:0)

写下面的代码,你会得到答案,

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
{
var listDic : NSMutableDictionary = NSMutableDictionary()
var headerArr : NSMutableArray = NSMutableArray()

@IBOutlet var tblList : UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.loadData()
    self.navigationController?.navigationBar.translucent = true
    self.navigationController?.navigationBar.tintColor = UIColor.grayColor()

}

func loadData()
{
    if let path = NSBundle.mainBundle().pathForResource("test", ofType: "plist") // Rename with your plist file name
    {
        self.listDic = NSMutableDictionary(contentsOfFile: path)! // NSMutableArray(contentsOfFile: path)!
    }

    if(self.listDic.count > 0)
    {
        self.headerArr.addObjectsFromArray(self.listDic.allKeys)
    }

    self.tblList.reloadData()
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return self.headerArr.count
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    let arr = self.listDic.valueForKey(self.headerArr.objectAtIndex(section) as! String) as! NSMutableArray
    return arr.count
}

func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return self.headerArr.objectAtIndex(section) as? String
}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = UITableViewCell(style: .Default, reuseIdentifier: "Cell")

    let arr = self.listDic.valueForKey(self.headerArr.objectAtIndex(indexPath.section) as! String) as! NSMutableArray

    cell.textLabel?.text = arr.objectAtIndex(indexPath.row) as? String
    return cell
}
}

这是基于您的plist文件并且工作正常。

希望这会对你有所帮助。