2015-05-30 3 views
11

В ViewController, я пытаюсь перезагрузить данные в TableView в другом ViewController так:Как перезагрузить данные в TableView из другого ViewController в Swift

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

Где tableViewController класс в Контроллер TableView (это не верхний верблюд, я знаю), а Table - TableView. Ну, это приводит к «фатальной ошибке: неожиданно обнаружено нуль при распаковке необязательного значения», и я предполагаю, что это имеет смысл, поскольку «представленный контроллер контроля» еще не загружен. Я также попытался это:

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

, которые дали тот же результат (я убедился, что tableViewController находился под текущим ViewController в стеке navigationController). Я сбив с толку о том, что мне следует делать ... Я чувствую, что должно быть проще относиться к свойствам в разных контроллерах представлений. Возможно, я немного расплывчата; если я, скажите мне, что вам нужно знать!

+0

Я пытаюсь понять, почему вы хотели бы это сделать. Контроллеры просмотра обычно должны иметь дело со своими собственными свойствами и не сообщать другим контроллерам представлений о том, что делать. Может быть, есть лучший способ решить вашу проблему? –

ответ

35

Xcode 9 • Swift 4

Создание уведомления Название:

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

Вы можете оставить уведомление

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

И добавить наблюдателя в контроллере представления, что вы хотите для перезагрузки данных:

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

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

Но если я не на том, что tableView означает на другой странице или в контроллере просмотра, то в то время часть NSNotificationCenter.defaultCenter() никогда не будет иметь bcoz, которая никогда не загружалась в то время .. тогда как я могу ее обработать. –

+0

@Leo, во-первых, спасибо за очень полезный ответ. Во-вторых, вы, очевидно, знаете больше, чем я о Swift, поэтому мне было интересно, можете ли вы объяснить, что делает версию Xcode актуальной. Даже страница [Swift language] (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/) не ссылается на версию Xcode, которая необходима для запуска Swift 3.1. –

Смежные вопросы