首先,我在 Firebase 中存储了 2 组数据。我会将这两套都包含在一张照片中。
第一张照片显示了我保存所有用户个人资料的位置。
当有人在应用程序上签到时,我会在不同的地方存储他们的用户名和签到时间。
在上面的照片中,您可以看到目前有 2 位用户在“12-3-2017 Block 2”签到
我存储数据没问题。
但是我在显示数据时遇到了问题。
我希望能够创建一个 UITableView 来显示所有已签到的用户以及他们签到的时间,而在同一个列表中显示所有尚未签到的用户。
import UIKit
import Firebase
struct checkInStruct {
let userName : String!
let hour : String!
let minutes : String!
let userNameFromAllUsers : String!
}
class checkInDaysTableViewController: UITableViewController {
//Variables
var lastChildNameSegue = ""
var posts = [checkInStruct]()
let user = FIRAuth.auth()?.currentUser
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "\(lastChildNameSegue)"
print("Name of Child After Segue -> \(lastChildNameSegue)")
loadCheckedInUsers()
loadAllUsers()
print(posts)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
let userName = posts[indexPath.row].userName
let hour = posts[indexPath.row].hour
var minute = posts[indexPath.row].minutes
let userNameOfAllUsers = posts[indexPath.row].userNameFromAllUsers
let label1 = cell?.viewWithTag(1) as! UILabel
let label2 = cell?.viewWithTag(2) as! UILabel
if(hour == nil || hour == ""){
//Users isnt signed in
label1.text = "\(userName!)"
label2.text = "User Not checked in"
}else{
label1.text = "\(userName!)"
label2.text = "\(hour!):\(minute!)"
}
return cell!
}
func loadCheckedInUsers (){
let databaseRef = FIRDatabase.database().reference()
let userID = user?.uid
databaseRef.child("users").child("\(userID!)").child("checkins").child("\(lastChildNameSegue)").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in
let userNameSnapValue = snapshot.value as? NSDictionary
let userName = userNameSnapValue?["userName"] as? String
let hourSnapValue = snapshot.value as? NSDictionary
let hour = hourSnapValue?["hour"] as? String
let minutesValue = snapshot.value as? NSDictionary
let minutes = minutesValue?["minutes"] as? String
print(userName!)
print(hour!)
print(minutes!)
self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
self.tableView.reloadData()
})
}
func loadAllUsers(){
let databaseRef = FIRDatabase.database().reference()
let userID = user?.uid
databaseRef.child("users").child("\(userID!)").child("employeesorstudents").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in
let userNameSnapValue = snapshot.value as? NSDictionary
let userName = userNameSnapValue?["userName"] as? String
let hour = ""
let minutes = ""
print(userName!)
self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
self.tableView.reloadData()
})
}
}
如您所见,我将数据存储在一个结构中。
但是,在应用程序上,它同时显示所有用户和 checkin 用户数据库中的用户名。
在屏幕截图中,您会看到“Brandon Happy”有签到时间,然后他再次出现说他从未签到过。如何从结构中删除重复数据?
最佳答案
一切看起来都不错,但是您应该做的不是将数据添加到结构中(如果它已经存在),因此您需要做的是修复 loadAllUsers() 函数。
func loadAllUsers(){
let databaseRef = FIRDatabase.database().reference()
let userID = user?.uid
databaseRef.child("users").child("\(userID!)").child("employeesorstudents").queryOrderedByKey().observe(.childAdded, with: { (snapshot) in
let userNameSnapValue = snapshot.value as? NSDictionary
let userName = userNameSnapValue?["userName"] as? String
let hour = ""
let minutes = ""
print(userName!)
databaseRef.child("users").child("\(userID!)").child("checkins").child("\(self.lastChildNameSegue)").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChild("\(userName!)"){
print("User already checked in")
}else{
print("user has not yet checked in")
self.posts.insert(checkInStruct(userName: userName, hour: hour, minutes: minutes, userNameFromAllUsers: userName) , at: 0)
self.tableView.reloadData()
}
})
})
}
在 if 语句中,它将确定用户是否已经 checkin ,然后将其添加到结构中(如果尚未 checkin )。
关于ios - 将 Firebase 数据合并到 TableView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42756135/