gpt4 book ai didi

iOS Swift 5 在 TabBarController 的 View Controller 中使用云数据库中的数据

转载 作者:行者123 更新时间:2023-11-29 05:16:53 25 4
gpt4 key购买 nike

问题:我无法将数据下载到单例类中的数组中以填充两个 View Controller 中的 TableView 。

我正在编写一个带有 Parse 后端的银行存折 iOS 应用程序。我在选项卡栏 Controller 中有一个登录 View Controller 和四个其他 View Controller 。我有一个单例类,它从 Parse 服务器获取数据并加载四个数组。我希望该数据填充其他两个 View Controller 中的 TableView 。我想尽可能少地进行数据调用。初始 View Controller 是用户输入借方和贷方的地方。因此,我的计划是从 viewDidLoad 调用 GetData 类来填充表,以防用户在不输入借方或贷方的情况下访问它们。

当输入借记或贷记时,有一个函数将借记或贷记保存到 Parse 服务器后,再次调用 GetData 类以更新 GetData 类中的数组。

两个 View Controller 访问 GetData 类中的数组来填充表格,并且当通过选项卡 Controller 访问 View 时,每个 View Controller 的 viewDidAppear 中都会调用 tableView.reloadData() 。

它最多只能间歇性地工作。有时我获得五次成功更新,然后它一直显示旧数据,然后它会突然显示所有数据。

查看我的云数据库,所有条目在创建时都在那里,并且我已经验证 viewWillAppear 正在每个访问的 View Controller 中触发。

我需要的是一种可靠的方法来获取数据以在其他 View Controller 中更新。时间。如果需要的话,我很乐意废弃这个应用程序并重写。

这是我的单例类的代码:

    class GetData {

static let sharedInstance = GetData()

var transactionArray = [String]()
var dateArray = [String]()
var toFromArray = [String]()
var isDebitArray = [String]()

func getdata() {

let query = PFQuery(className:"Transaction")

query.findObjectsInBackground { (objects, error) in

self.transactionArray.removeAll()
self.dateArray.removeAll()
self.toFromArray.removeAll()
self.isDebitArray.removeAll()

print("query fired")

if objects != nil {

for object in objects! {

if let amount = object.object(forKey: "amount") as? String {
if let date = object.object(forKey: "date") as? String {
if let toFrom = object.object(forKey: "toFrom") as? String {
if let isDebit = object.object(forKey: "isDebit") as? String {

self.transactionArray.append(amount)
self.dateArray.append(date)
self.toFromArray.append(toFrom)
self.isDebitArray.append(isDebit)

}
}
}
}
}
}

self.transactionArray.reverse()
self.dateArray.reverse()
self.toFromArray.reverse()
self.isDebitArray.reverse()

dump(self.toFromArray)

}
}
}

以下是其中一个 View Controller 的示例:

class RecordVC: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet var recordTableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()

recordTableView.delegate = self
recordTableView.dataSource = self

recordTableView.reloadData()

}

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

recordTableView.reloadData()

print("recordVC viewWillAppear fired")

}


@IBAction func resetFoundButton(_ sender: Any) {
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = recordTableView.dequeueReusableCell(withIdentifier: "RecordCell", for: indexPath) as! RecordCell
cell.amountLabel?.text = "$\(GetData.sharedInstance.transactionArray[indexPath.row])"
cell.dateLabel?.text = "\(GetData.sharedInstance.dateArray[indexPath.row])"
cell.toFromLabel?.text = "\(GetData.sharedInstance.toFromArray[indexPath.row])"
let cellColor = backGroundColor(isDebit: GetData.sharedInstance.isDebitArray[indexPath.row])
cell.backgroundColor = cellColor
cell.backgroundColor = cellColor
return cell

}

func backGroundColor(isDebit:String) -> UIColor{

if isDebit == "false" {

return UIColor.green

} else {

return UIColor.blue

}

}

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

return GetData.sharedInstance.transactionArray.count

}


}

谢谢

最佳答案

我想说,在 GetData Class 中的查询执行和数据更新之后,您应该触发通知或使用委托(delegate)来 reloadData() ,而不是通过在 viewWillAppear() 中调用 tableView.reloadData() 来重新加载表表格 View 。

发生的情况是,有时当调用 tableView.reloadData() 时,单例类(GetData 类)中的数据尚未更新。

函数 getdata() {

        let query = PFQuery(className:"Transaction")

query.findObjectsInBackground { (objects, error) in

self.transactionArray.removeAll()
self.dateArray.removeAll()
self.toFromArray.removeAll()
self.isDebitArray.removeAll()

print("query fired")

if objects != nil {

for object in objects! {

if let amount = object.object(forKey: "amount") as? String {
if let date = object.object(forKey: "date") as? String {
if let toFrom = object.object(forKey: "toFrom") as? String {
if let isDebit = object.object(forKey: "isDebit") as? String {

self.transactionArray.append(amount)
self.dateArray.append(date)
self.toFromArray.append(toFrom)
self.isDebitArray.append(isDebit)
// Here you should fire up a notification to let the 2 ViewControllers know that data has to be reloaded.
}
}
}
}
}
}

self.transactionArray.reverse()
self.dateArray.reverse()
self.toFromArray.reverse()
self.isDebitArray.reverse()

dump(self.toFromArray)

}
}

关于iOS Swift 5 在 TabBarController 的 View Controller 中使用云数据库中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59097995/

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