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()]
}
}
答案 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