iOS Swift 5 在 TabBarController 的视图控制器中使用来自云数据库的数据
iOS Swift 5 Using Data from Cloud Database in View Controllers in TabBarController
问题:我无法将数据下载到单例中的数组中 class 以填充两个视图控制器中的 table 视图。
我正在编写一个带有 Parse 后端的存折 iOS 应用程序。我在 Tab Bar Controller 中有一个登录 viewController 和其他四个视图控制器。我有一个单例 class 从 Parse 服务器获取数据并加载四个数组。我希望该数据填充其他两个视图控制器中的 table 视图。我想尽可能少地拨打数据电话。初始视图控制器是用户输入借方和贷方的地方。所以我的计划是从 viewDidLoad 调用 GetData class 来填充 tables 以防用户在没有输入借方或贷方的情况下访问它们。
当输入借方或贷方时,有一个函数在将借方或贷方保存到 Parse 服务器后,再次调用 GetData class 以更新 GetData [=36= 中的数组].
两个视图控制器访问GetDataclass中的数组来填充tables,并且在每个视图控制器的viewDidAppear中有一个tableView.reloadData()调用时通过选项卡控制器访问视图。
它最多只能间歇性地工作。有时候更新成功5次就一直显示旧数据,然后突然显示所有数据
查看我的云数据库,创建时所有条目都在那里,并且我已验证 viewWillAppear 在每个访问的视图控制器中触发。
我需要的是一种可靠的方法来让数据在其他视图控制器中更新。时间。如果需要,我很乐意废弃此应用程序并重写。
这是我的单例代码class:
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)
}
}
}
这是其中一个视图控制器的示例:
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 中更新数据之后,不是通过在 viewWillAppear() 中调用 tableView.reloadData() 来重新加载表,而是应该发出通知或在 tableview 中使用委托 reloadData()。
发生的情况是,有时当调用 tableView.reloadData() 时,单例中的数据 class (GetData class) 尚未更新。
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)
// 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)
}
}
问题:我无法将数据下载到单例中的数组中 class 以填充两个视图控制器中的 table 视图。
我正在编写一个带有 Parse 后端的存折 iOS 应用程序。我在 Tab Bar Controller 中有一个登录 viewController 和其他四个视图控制器。我有一个单例 class 从 Parse 服务器获取数据并加载四个数组。我希望该数据填充其他两个视图控制器中的 table 视图。我想尽可能少地拨打数据电话。初始视图控制器是用户输入借方和贷方的地方。所以我的计划是从 viewDidLoad 调用 GetData class 来填充 tables 以防用户在没有输入借方或贷方的情况下访问它们。
当输入借方或贷方时,有一个函数在将借方或贷方保存到 Parse 服务器后,再次调用 GetData class 以更新 GetData [=36= 中的数组].
两个视图控制器访问GetDataclass中的数组来填充tables,并且在每个视图控制器的viewDidAppear中有一个tableView.reloadData()调用时通过选项卡控制器访问视图。
它最多只能间歇性地工作。有时候更新成功5次就一直显示旧数据,然后突然显示所有数据
查看我的云数据库,创建时所有条目都在那里,并且我已验证 viewWillAppear 在每个访问的视图控制器中触发。
我需要的是一种可靠的方法来让数据在其他视图控制器中更新。时间。如果需要,我很乐意废弃此应用程序并重写。
这是我的单例代码class:
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)
}
}
}
这是其中一个视图控制器的示例:
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 中更新数据之后,不是通过在 viewWillAppear() 中调用 tableView.reloadData() 来重新加载表,而是应该发出通知或在 tableview 中使用委托 reloadData()。
发生的情况是,有时当调用 tableView.reloadData() 时,单例中的数据 class (GetData class) 尚未更新。
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)
// 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)
}
}