Malorrr
Malorrr

Reputation: 263

Tableview contents will not appear until screen is clicked

Developing a swift app at the moment with a table view that is populated using cloud kit.

For some reason when the app opens the tableview appears blank, but once the screen is touched my list of entries suddenly appear.

I've provided my whole Tableview Master Class below, My thinking is that it's something to do with the viewDidLoad() function but I can't seem to figure it out no matter what I try.

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.
        }
    }


}

Upvotes: 2

Views: 979

Answers (3)

Mumtaz Hussain
Mumtaz Hussain

Reputation: 1125

Swift 5.2:

DispatchQueue.main.async{
  self.tableView.reloadData()
}

Upvotes: 0

hilmic
hilmic

Reputation: 1

If you try these, it works

DispatchQueue.main.async(execute: {
            self.tableView.reloadData()
        })

Upvotes: 0

Phillip Mills
Phillip Mills

Reputation: 31016

Considering the reload is happening in a completion handler, I assume it's on a background thread. Try dispatching your UI update back to the main thread.

(Typing a sample without Xcode here, so check my syntax.)

Example:

dispatch_async(dispatch_get_main_queue()) {
    self.tableView.reloadData()
}

Upvotes: 5

Related Questions