2016-11-22 1 views
0

Ich möchte um Hilfe bitten, Erinnerungen zu erhalten. Scheint wie numberOfRowsInSection und wird aufgerufen, bevor eventStore.fetchReminders fertig ist. Hier ist mein Code:swift 3 numberofrowsinsection läuft vor viewwilllappear holt Erinnerungen

override func viewWillAppear(_ animated: Bool) { 
    print("****viewWillAppear") 
    super.viewWillAppear(true) 
    self.eventStore = EKEventStore() 
    self.reminders = [EKReminder]() 
    //Added to initialize 
    self.reminders.removeAll() 
    self.eventStore!.requestAccess(to: EKEntityType.reminder, completion: 
     {(granted, error) in 
      if granted 
      { 
       let predicate = self.eventStore.predicateForReminders(in: nil) 
       self.eventStore.fetchReminders(matching: predicate, completion: { (reminders: [EKReminder]?) -> Void in 
        self.reminders = reminders 
        DispatchQueue.main.async() { 
         //Added 
         self.reminders = reminders 
         self.tableView.reloadData() 
        } 
       }) 

      } 
      else 
      { 
       print("The app is not permitted to access reminders, make sure to grant permission in the settings and try again") 
      } 
    }) 

    } 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    print("*****numberOfRowsInSection") 
    print("numberOfRowsInSection reminders \(self.reminders.count)") 
    return self.reminders.count 
} 
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    print("****titleForHeaderInSection") 
    print("titleForHeaderInSection reminders \(self.reminders.count)") 
    return "test" 
} 

Ich versuchte es in viewDidLoad setzen, aber gleiche geschieht, die self.reminders.count in numberOfRowsInSection ist 0. Rückkehr ich auch fetchReminders versucht OUTSIDE von requestAccess zu nennen (weil ich dachte, requestAccess war nicht feuern), aber am Ende habe ich dasselbe. Gibt es irgendetwas, was ich falsch mache? Würde wirklich jede Beratung zu schätzen wissen!

Danke!

+0

Können Sie versuchen, super.viewWillAppear() in Ihrem viewWillAppear hinzuzufügen? Außerdem solltest du folgendes in deiner viewDidLoad() aufrufen: self.eventStore! .requestAccess (zu: EKEntityType.reminder, Fertigstellung: – Mikael

+0

hi mikael, danke! Ich habe den super.viewWillAppear hinzugefügt. Ich habe auch den requestAccess in viewDidLoad hinzugefügt Ich bekomme das gleiche Ergebnis :( – iceman

+0

Zumindest bekommst du hier einen besseren Code. Selbst wenn es dein Problem nicht behoben hat;) froh zu sehen, dass du es beheben könntest. – Mikael

Antwort

2

Das ist normal. Die UITableViewController versucht, den Inhalt der Tabellenansicht anzuzeigen, während der View-Controller angezeigt wird. Sie sollten self.reminders mit einem leeren Array zu Beginn von viewDidLoad initialisieren, damit die Tabellenansicht anfänglich keine Ergebnisse zeigt.

Sobald Ihr Zugriff auf den Ereignisspeicher abgeschlossen ist, wird Ihr Code zum Zurücksetzen self.reminders aufgerufen und die Tabellenansicht erneut geladen.

Eine wichtige Änderung, die Sie vornehmen sollten, ist self.reminders im DispatchQueue.main.async() Block zu setzen. Dies stellt sicher, dass die Datenquelle aktualisiert wird, unmittelbar bevor die Tabelle neu geladen wird und nicht vorher. Mit anderen Worten, aktualisieren Sie Ihren Code:

self.eventStore.fetchReminders(matching: predicate, completion: { (reminders: [EKReminder]?) -> Void in 
    DispatchQueue.main.async() { 
     self.reminders = reminders 
     self.tableView.reloadData() 
    } 
}) 

Eine andere Änderung zunächst zu prüfen, ist self.reminders-nil auf und Ihre Tabellenansicht Datenquelle Methoden behandeln dies als Signal eine Reihe zu zeigen, der sagt „Laden“ (oder etwas ähnliches). Andernfalls können sich Ihre Benutzer wundern, warum sie für eine kurze Zeit auf einem größtenteils leeren Bildschirm erscheinen.

+0

danke maddy! Was meinst du mit " setze die self.reminders innerhalb des dispatchqeueue.main.async() blocks "? – iceman

+0

übrigens meine Entschuldigung, ich vergaß zu erwähnen, ich bin neu zu swift. basierend auf meinen Erkenntnissen, viewWillAppear feuert dann stoppt es, wenn es" selbst sieht. eventStore! .requestAccess (zu: EKEntityType.reminder, completion: "dann springt es direkt zur numberOfSections-Funktion. Nach ein paar Schleifen (2-3) kommt es dann wieder zurück und startet den fetchReminders-Code. – iceman

+0

Siehe meine aktualisierte an zeigen, was ich über den 'async' Block weiß. – rmaddy