如何将带有键的字典传递给表格视图

时间:2016-04-28 02:37:57

标签: ios swift firebase

    import UIKit
import Firebase

class PendingVC: UIViewController,UITableViewDelegate, UITableViewDataSource {
    @IBOutlet weak var myTableView: UITableView!

let ref = firebasehelper.firebaseURL()
var data = [[:]]




//MARK: vars
        var address:AnyObject!
        var postTitle:AnyObject!
    override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.dataSource = self
        myTableView.delegate = self

//下面的例子工作得很好我按照它应该看的方式得到布局,但我想从下面的firebase函数生成字典。

/*
     self.data = [
     [
     "firstname": "sallie",
     "lastname": "ammy"
     ],
     [
     "firstname": "jamie",
     "lastname": "brown"
     ]
     ]

     */

它应该看起来像这样,我想将数据传递到表中。我不确定我是否应该循环。它在下面的方式会带来以下错误"致命错误:在解开一个Optional值时意外发现nil"当我打印它们时,变量不是nil我得到了数据。

ref.childByAppendingPath("backend/posts").queryOrderedByChild("requestFrom").queryEqualToValue(ref.authData.uid).observeEventType(.ChildAdded, withBlock: {snapshot in
                var firstname = snapshot.value["firstname"] as! String
                var lastname = snapshot.value["lastname"] as! String


         self.data = [
            [
                "firstname": firstname,
                "lastname": lastname
            ]
        ]



       print(self.data)
    })







}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! statusPrototypeCell


    let object = data[indexPath.row]



cell.firstname.text = object["firstname"] as! String
  cell.lastname.text = object["lastname"] as! String


    return cell
}


override func viewWillAppear(animated: Bool) {
    navigationController?.navigationBarHidden = false

    navigationController?.navigationBar.barTintColor = UIColor(red:0.4, green:0.76, blue:0.93, alpha:1.0)
    navigationController?.navigationBar.translucent = false
    self.title = "Signup"

    self.navigationController?.navigationBar.tintColor = UIColor.whiteColor()
    navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
}
}

2 个答案:

答案 0 :(得分:0)

您正在使用词典,因此它不会返回计数值,所以更好地使用像[]而不是[:]

这样的数组

还有一件事您忘记了以下语句要包含在ViewDidLoad方法中 myTableView.delegate = self

答案 1 :(得分:0)

虽然您可以将字典用作数据源,但它是无序的,这意味着tableView中的项目也将是无序的。使用阵列是一种更好的解决方案。实际上,一组字典构成了一个很好的有序数据源。

另外,为了澄清,您不会根据您的问题将字典或数据传递给tableView。 tableView通过它的委托方法从数据源收集数据

假设以下Firebase数据结构

"users" : {
    "uid_0" : {
      "first_name" : "Bill",
      "last_name" : "Nye"
    },
    "uid_1" : {
      "first_name" : "Leroy",
      "last_name" : "Jenkins"
    },
    "uid_2" : {
      "first_name" : "Peter",
      "last_name" : "Sellers"
    }
  }

并填充一系列词典:

var usersArray: [Dictionary<String, String>] = []

let usersRef = self.myRootRef.childByAppendingPath("users")

usersRef.observeEventType(.ChildAdded, withBlock: { snapshot in

  var userDict = [String:String]()
  userDict["key"] = snapshot.key
  userDict["firstName"] = snapshot.value["first_name"] as? String
  userDict["lastName"] = snapshot.value["last_name"] as? String         
  self.usersArray.append(userDict)
})

要访问数据,请使用您在上面创建的密钥。

例如:从按钮

打印数组中的用户
for userDict in self.usersArray {
    let key = userDict["key"]
    let fName = userDict["firstName"]
    let lName = userDict["lastName"]

    print("\(key!)  \(fName!)  \(lName!)")
}

一旦你对它有了解,你就可以使用usersArray来填充tableView。

let userDict = usersArray[indexPath.row]
cell.firstname.text = userDict["firstName"] as! String
cell.lastname.text = userDict["lastName"] as! String

棘手的一点是在数组中加载所需的所有数据,然后重新加载tableView以显示它。如果您有一小组数据,.Value将适用于此。更大的数据集需要另一种技术,请参阅This Answer