gpt4 book ai didi

ios - UITableview 从 Firebase 加载数据和重复行

转载 作者:可可西里 更新时间:2023-11-01 02:12:19 24 4
gpt4 key购买 nike

我正在尝试构建一个从 firebase 数据库加载数据的应用程序。

将成员保存到 Firebase 没有任何问题。将成员从 Firebase 加载到我的 UITableView 正在工作,然后我正在对成员进行排序,并根据名字第一个字母(A、B、C 等,如 iOS 联系人应用程序中所示)在部分标题下分别添加成员这也有效,但是我的问题发生在我加载所有用户之后,例如转到选项卡 1,然后切换回成员选项卡,所有显示的成员/单元格都是重复的。如果我重复相同的过程来回切换选项卡,所有单元格都会重复三次,然后继续。

我搜索了不同的来源来寻找解决方案,但我找不到任何类似的东西。

有谁知道解决方案或我做错了什么?

谢谢!

我的 View Controller :

import Foundation
import UIKit

class MembersTableViewController: UITableViewController {

var FBref = FIRDatabaseReference()

var members: [Member] = []
var membersDict = [String: [String]]()
var memberSectionTitles = [String]()

// TODO: Implement user.
//var user: AdminUser!
let fakeuservariable = "fakeuser"

@IBOutlet var memberListTableView: UITableView!


override func viewDidLoad() {
super.viewDidLoad()

}

override func viewDidAppear(_ animated: Bool) {
loadDataFromFirebase()
createFirstnameDict()

}


override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()

}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {

return memberSectionTitles.count

}

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

let firstLetterKey = memberSectionTitles[section]
if let firstnameValues = membersDict[firstLetterKey] {

return firstnameValues.count
}
return 0

}

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

return memberSectionTitles[section]

}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "membercell", for: indexPath)

let firstLetterKey = memberSectionTitles[indexPath.section]
if let firstnameValues = membersDict[firstLetterKey] {

cell.textLabel?.text = firstnameValues[indexPath.row]

// Not working
//let memberDetails = members[indexPath.row]
//cell.detailTextLabel!.text = "Amount left: \(memberDetails.memberamount)"

}

return cell

}

func createFirstnameDict() {

for firstname in members {

var firstLetter = firstname.firstname

let firstnameKey = firstLetter.substring(to: firstLetter.characters.index(firstLetter.startIndex, offsetBy: 1))
if var memberValues = membersDict[firstnameKey] {
memberValues.append(firstLetter)
membersDict[firstnameKey] = memberValues
} else {
membersDict[firstnameKey] = [firstLetter]

}

}

memberSectionTitles = [String](membersDict.keys)
memberSectionTitles = memberSectionTitles.sorted { $0 < $1 }

}

func loadDataFromFirebase() {

let FBref = FIRDatabase.database().reference()
FBref.child("member-list").observeSingleEvent(of: .value, with: { (snapshot) in
var resultItem: [Member] = []
for item in snapshot.children {
let memberItem = Member(snapshot: item as! FIRDataSnapshot)
resultItem.append(memberItem)

}

self.members = resultItem

self.createFirstnameDict()

self.tableView.reloadData()


}) { (error) in

print(error.localizedDescription)

}

}

}

我的成员(member)模型:

import Foundation

struct Member {

let firstname: String
let lastname: String
let email: String
let phonenumber: String
let socialsecuritynr: String
let memberamount: String
let addedByUser: String
let key: String
let ref: FIRDatabaseReference?

init(firstname: String, lastname: String, email: String, phonenumber: String, socialsecuritynr: String, memberamount: String, addedByUser: String, key: String = "") {
self.key = key
self.firstname = firstname
self.lastname = lastname
self.email = email
self.phonenumber = phonenumber
self.socialsecuritynr = socialsecuritynr
self.memberamount = memberamount
self.addedByUser = addedByUser
self.ref = nil

}

init(snapshot: FIRDataSnapshot) {
key = snapshot.key
let snapshotValue = snapshot.value as! [String: AnyObject]
firstname = snapshotValue["firstname"] as! String
lastname = snapshotValue["lastname"] as! String
email = snapshotValue["email"] as! String
phonenumber = snapshotValue["phonenumber"] as! String
socialsecuritynr = snapshotValue["socialsecuritynr"] as! String
memberamount = snapshotValue["memberamount"] as! String
addedByUser = snapshotValue["addedByUser"] as! String
ref = snapshot.ref
}

func toAnyObject() -> Any {
return ["firstname": firstname, "lastname": lastname, "email": email, "phonenumber": phonenumber, "socialsecuritynr": socialsecuritynr, "memberamount":memberamount, "addedByUser": addedByUser]

}

}

这是我之前和之后的 TableView:

TableView before and after

最佳答案

问题是由于您的方法放置错误地加载了 viewDidAppear 中的数据:

loadDataFromFirebase()
createFirstnameDict()

这意味着每次您的 View 出现时,您的数据都会被一次又一次地加载。要解决此问题,请将这些方法移至 viewDidLoad 中,您将不会遇到重复问题。所以你现在应该有:

override func viewDidLoad() {
super.viewDidLoad()

loadDataFromFirebase()
createFirstnameDict()
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)

}

关于ios - UITableview 从 Firebase 加载数据和重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40633270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com