2016-08-13 8 views
2

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") 
    } 
} 
+0

Da ich das nicht in der ursprünglichen Post setzen könnte. Hier ist ein Screenshot von meinem Storyboard: http: //imgur.com/Hntac8L – Rioner

+0

Riefst du 'tableView.Data()' irgendwo in einem Hintergrund-Thread? – FelixSFD

+0

Nein, nur loadView auf dem Haupt-Thread aufrufen, wenn specifiedDocs aktualisiert wird, und wenn Aufruf reloadData() in viewWillAppear – Rioner

Antwort

0

Oh, jetzt habe ich die Absicht, die Codes zu sehen. Aber, hast du einen Grund dafür? Es ist nicht richtig, loadView() direkt aufzurufen.

tableView.dataSource = self 
tableView.delegate = self 

Umzug nach ersten in viewWillAppear und wird es auch Arbeit außer getan wird schnell von Parse zu erhalten.

Normalweg wie unten sein wird:

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() 
    }) 
} 

self.loadView(), um self.tableView.reloadData().

tableView.dataSource = self
tableView.delegate = self

das nicht braucht.

override func viewWillAppear(animated: Bool) { 
super.viewWillAppear(animated) 
self.tableView.reloadData()} 

, die nicht zu braucht nicht.

Auf jeden Fall wird Ihre Codes funktionieren nur anrufen self.loadView ändern(), um self.tableView.reloadData()

+0

Vielen Dank Jay Choi! Ich kann nicht glauben, dass so eine dumme Sache mir so viele Kopfschmerzen bereitet hat ... Ich habe viel mehr Dinge ausprobiert, als ich brauchte. – Rioner

Verwandte Themen