Ich hoffe, Sie können mir helfen ... Ich habe versucht, dieses Problem seit ein paar Tagen herauszufinden.UITableViewController verschwindet nach asynchroner Abfrage
Ich verwende Parse (www.parse.com) als mein Backend und habe es auf meinem eigenen AWS-Server gehostet.
Aufbau der App: In AppDelegate, wenn Benutzer angemeldet ist, einen Viewcontroller zeigen, dass meine SlideMenuControllerSwift einrichtet (https://github.com/dekatotoro/SlideMenuControllerSwift) und meine TabBarController. [Storyboard] [1]
In meinem Tab-Bar-Controller habe ich einen Navigationscontroller, der zu einem UITableViewController führt, der zu einem anderen UITableViewController wechselt, wenn ich auf eine Zeile klicke.
Problem: http://imgur.com/izdCBgt
1) I auf eine Zeile klicken und es führt eine asynch Abfrage meiner Parse-Datenbank
2) Die Daten, die die Tabelle auffüllt und verschwindet dann
3) Wenn ich die Registerkarte ändere und zur Hauptregisterkarte zurückkehre, erscheinen die Daten wieder
Auch
1) I auf einer Zeile klicken und es führt eine asynch Abfrage meine Parse-Datenbank
2) Die Daten, die die Tabelle auffüllt und verschwinden dann
3) Wenn ich auf die ursprünglichen UITableViewController gehen zurück, es nicht richtig Übergang zurück, und ich brauche Tabs hin und her zu wechseln, bis es
-Code erneut angezeigt:
ich auf die Dokumente Tabelle view-Controller segue das Storyboard segue verwenden. Hier ist der relevante Code in meinem DocumentsTableViewController:
class DocumentTableViewController: UITableViewController, UIDocumentInteractionControllerDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, MMCropDelegate {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
print("initDocs")
}
var specificDocs=[Document](){
didSet{
dispatch_async(dispatch_get_main_queue(), {
//we might be called from the parse block which executes in seperate thread
self.loadView()
})
}
}
override func viewDidLoad() {
tableView.dataSource = self
tableView.delegate = self
print("we loadeD")
super.viewDidLoad()
navigationItem.title = "Job Documents"
let cameraButton = UIBarButtonItem(image: UIImage(named: "Camera"), style: .Plain, target: self, action: #selector(self.didPressCamera(_:)))
navigationItem.rightBarButtonItem = cameraButton
self.queryForTable()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
self.tableView.reloadData()
}
// Define the query that will provide the data for the table view
func queryForTable() {
// Run a spinner to show a task in progress
let progressHUD = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
progressHUD.label.text = "Loading..."
//2 using those jobActions to find which documents are mine
let query = PFQuery(className: Document.parseClassName())
query.whereKey(Document.jobActionCol(), containedIn: jobActions)
query.includeKey(Document.documentCategoryCol())
// do {
// let test = try query.findObjects()
// self.specificDocs = test as! [Document]
// progressHUD.hideAnimated(true)
// } catch {
// print("error!")
// }
// FIND WHY THIS DOESNT WORK....WHAT THE F
query.findObjectsInBackgroundWithBlock {
(objects: [PFObject]?, error: NSError?) -> Void in
if error == nil {
// The find succeeded.
self.specificDocs = objects as! [Document]
print("done")
progressHUD.hideAnimated(true)
} else {
// Log details of the failure
print("Error: \(error!) \(error!.userInfo)")
}
}
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return specificDocs.count
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("cellIdentifier")
if ((cell) == nil){
cell = UITableViewCell.init(style: .Default, reuseIdentifier: "cellIdentifier")
}
cell!.textLabel?.text = specificDocs[indexPath.row].documentCategory!.type!
print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
// print(UIApplication.sharedApplication().keyWindow?.performSelector("recursiveDescription"))
return cell!
}
deinit {
print("docs deinit")
}
}
Da ich das nicht in der ursprünglichen Post setzen könnte. Hier ist ein Screenshot von meinem Storyboard: http: //imgur.com/Hntac8L – Rioner
Riefst du 'tableView.Data()' irgendwo in einem Hintergrund-Thread? – FelixSFD
Nein, nur loadView auf dem Haupt-Thread aufrufen, wenn specifiedDocs aktualisiert wird, und wenn Aufruf reloadData() in viewWillAppear – Rioner