2015-05-30 14 views
11

W ViewController, próbuję odświeżyć dane w Tableview w innym ViewController tak:Jak odświeżyć dane w Tableview z innej ViewController w Swift

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

Gdzie tableViewController jest klasa w Kontroler TableView (to nie jest wielka skrzynka wielbłądów, wiem) i tabela to TableView. Cóż, zrobienie tego powoduje "błąd krytyczny: nieoczekiwanie znaleziono zero podczas rozpakowywania wartości opcjonalnej" i wydaje mi się, że ma to sens, ponieważ "presentViewController" nie został jeszcze załadowany. Próbowałem też tak:

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

co dało ten sam wynik (zrobiłem czy tableViewController był pod bieżącym ViewController na stosie navigationController). Jestem zdumiony tym, co powinienem zrobić ... Mam wrażenie, że łatwiej będzie odnosić się do właściwości w różnych kontrolerach widoku. Mogę być trochę niejasny; jeśli tak, to powiedz mi, co powinieneś wiedzieć!

+0

Próbuję zrozumieć, dlaczego chciałbyś to zrobić. Kontrolery widoku powinny ogólnie radzić sobie z własnymi właściwościami i nie informować innych kontrolerów widoku, co mają robić. Może jest lepszy sposób na rozwiązanie twojego problemu? –

Odpowiedz

35

Xcode 9 • Swift 4

utworzyć nazwę zgłoszenia:

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

można wysłać powiadomienie

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

i dodaj obserwatora w kontrolerze widoku, który chcesz aby ponownie załadować dane:

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

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

Ale jeśli nie jestem na tym tableView oznacza na innej stronie lub kontroler widoku, .. w tym czasie część NSNotificationCenter.defaultCenter() nigdy nie stanie się bcoz jej nigdy załadowane w tym czasie .. potem jak mogę sobie z tym poradzić. –

+0

@Leo, po pierwsze, dziękuję za bardzo pomocną odpowiedź. Po drugie, oczywiście wiesz więcej niż ja o Swift, więc zastanawiałem się, czy mógłbyś wyjaśnić, co sprawia, że ​​wersja Xcode jest trafna. Nawet strona [Swift language page] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/) nie odnosi się do wersji Xcode, która jest niezbędna do uruchomienia Swift 3.1. –

Powiązane problemy