2015-05-30 8 views
11

In un ViewController, sto cercando di ricaricare i dati in un TableView in un altro ViewController in questo modo:Come ricaricare i dati in un TableView da un ViewController diversa a Swift

(self.presentedViewController as! tableViewController).table.reloadData() 

Dove tableViewController è la classe nel Il controller di TableView (non è il caso del cammello superiore, lo so) e la tabella è il TableView. Bene, facendo questo produce "errore fatale: trovato inaspettatamente nullo mentre scartando un valore Opzionale" e immagino che abbia senso dal momento che il "PresentationViewController" non è stato ancora caricato. Ho anche provato questo:

(self.navigationController!.viewControllers[self.navigationController!.viewControllers.count - 2] as! tableViewController).table.reloadData() 

che ha prodotto lo stesso risultato (I fatto che il tableViewController era sotto il ViewController corrente sulla pila navigationController). Sono sconcertato su cosa dovrei fare ... Mi sento come dovrebbe essere più facile fare riferimento alle proprietà in diversi controller di visualizzazione. Potrei essere un po 'vago; se lo sono, dimmi cosa devi sapere!

+0

Sto cercando di capire perché vorresti farlo. I controller di vista dovrebbero generalmente gestire le loro proprietà e non dire agli altri controller di vista cosa fare. Forse c'è un modo migliore per risolvere il tuo problema? –

risposta

35

Xcode 9 • Swift 4

Creare un nome di notifica:

extension Notification.Name { 
    static let reload = Notification.Name("reload") 
} 

È possibile inviare una notifica

NotificationCenter.default.post(name: .reload, object: nil) 

E aggiungere un osservatore presso il controller della vista che si desidera per ricaricare i dati:

override func viewDidLoad() { 
    super.viewDidLoad() 
    NotificationCenter.default.addObserver(self, selector: #selector(reloadTableData), name: .reload, object: nil) 
} 

@objc func reloadTableData(_ notification: Notification) { 
    tableView.reloadData() 
} 
+1

Ma se non sono su quella tabellaView significa su un'altra pagina o su un controller di visualizzazione, .. in quel momento NSNotificationCenter.defaultCenter() parte non accadrà mai bcoz non è mai stato caricato in quel momento .. quindi come posso gestirlo. –

+0

@Leo, innanzitutto, grazie per una risposta molto utile. In secondo luogo, tu ovviamente sai più di me su Swift, quindi mi chiedevo se potevi spiegare cosa rende rilevante la versione di Xcode. Anche la [Pagina della lingua Swift] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/) non fa riferimento alla versione di Xcode necessaria per eseguire Swift 3.1. –

Problemi correlati