使用云工具包填充表格视图,开发一个swift应用程序。
由于某些原因,当应用程序打开时,tableview显示为空白,但是一旦触摸屏幕,我的条目列表就会突然出现。
我已经在下面提供了我的整个Tableview大师班,我的想法是它与viewDidLoad()
功能有关,但无论如何我似乎都无法解决这个问题。我尝试了什么。
import UIKit
import CloudKit
import MobileCoreServices
class MasterViewController: UITableViewController {
//// DB setup (outside DidLoad)
let container = CKContainer.defaultContainer()
var Database: CKDatabase?
var currentRecord: CKRecord?
var detailViewController: DetailViewController? = nil
///Array to save dbrecords
var objects = [CKRecord]()
/// Initialise object of ClipManager class
let MyClipManager = ClipManager()
override func viewDidLoad() {
super.viewDidLoad()
// Database loading on runtime
Database = container.privateCloudDatabase
///Build Query
let query = CKQuery(recordType: "CloudNote", predicate: NSPredicate(format: "TRUEPREDICATE"))
///Perform query on DB
Database!.performQuery(query, inZoneWithID: nil) { (records, error) -> Void in
if (error != nil) {
NSLog("Error performing query. \(error.debugDescription)")
return
}
self.objects = records!
self.tableView.reloadData()
}
// Do any additional setup after loading the view, typically from a nib.
self.navigationItem.leftBarButtonItem = self.editButtonItem()
let addButton = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "insertNewObject:")
self.navigationItem.rightBarButtonItem = addButton
if let split = self.splitViewController {
let controllers = split.viewControllers
self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
}
}
override func viewWillAppear(animated: Bool) {
self.clearsSelectionOnViewWillAppear = self.splitViewController!.collapsed
super.viewWillAppear(animated)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Tableview stuff --- Done
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
/////// Get number of rows
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count
}
//// FIll the table
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let object = objects[indexPath.row]
cell.textLabel!.text = object.objectForKey("Notes") as? String
return cell
}
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}
//// Deleting the table
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
//DB call working
MyClipManager.DeleteMethod(Database!, MyRecord:objects[indexPath.row])
objects.removeAtIndex(indexPath.row)
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}
}
答案 0 :(得分:4)
考虑到重载是在完成处理程序中发生的,我假设它在后台线程上。尝试将UI更新分发回主线程。
(在这里输入没有Xcode的样本,所以请检查我的语法。)
示例:
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
答案 1 :(得分:0)
如果您尝试使用这些工具,它将起作用
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
})
答案 2 :(得分:0)
Swift 5.2:
DispatchQueue.main.async{
self.tableView.reloadData()
}