SplitView - перезагрузить данные в master tableView на основе деталей, измененных в swift

Я создаю splitView с tableView в главном представлении и tableView со статическими ячейками в двух подробностях (см. Рисунок). Структура приложения

Имена контроллеров представлений: DocsTableViewController — главное представление (слева) DocDetailTableViewController — подробное представление (вверху справа) DocEditTableViewControler — второе подробное представление (внизу справа)

DocsTVC — это список врачей, DocDetailTVC — это сведения о пользователе-враче, выбранном в DocsTVC, а на DocEditTVC пользователь может редактировать данные врача, отображаемые в DocDetailTVC, или добавлять совершенно новые данные (в зависимости от того, нажал ли пользователь кнопку редактирования или добавления).

Все эти вещи работают нормально - показать детали, показать форму редактирования и сохранить отредактированный или новый документ. Проблема заключается в представлении главной таблицы. Я пытаюсь перезагрузить его подробно после сохранения отредактированного/нового элемента, и к print я вижу, что перезагружаются данные, но не таблица. Таблица отображается по-прежнему, и мне нужно перейти к тому же другому экрану приложения, а затем вернуться, чтобы увидеть перезагруженное представление таблицы. Что я должен делать?

После сохранения доктора на DocEditTVC я возвращаюсь к этому методу:

    @IBAction func saveToDocViewController (segue: UIStoryboardSegue){
    let controller = DocsTableViewController()
    controller.tableView.reloadData()
    print("[SPLIT VIEW] detail: \(controller.docs.count)")
}

И некоторые коды из DocsTableViewControler (основной вид):

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.delegate = self
    self.tableView.dataSource = self

    // menu
    if inputsMenuButton != nil {
        inputsMenuButton.target=self.revealViewController()
        inputsMenuButton.action=#selector(SWRevealViewController.revealToggle(_:))
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }

    // navigation bar
    self.navigationController?.navigationBar.barTintColor = OAKScolor().colorOAKSmain()
    self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

    // data load
    print("[SPLIT VIEW]: ViewDidLoad")
    dataLoad()
    self.tableView.reloadData()


    // split view
    self.splitViewController?.delegate = self
    self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
}

и

    func dataLoad() {
    print("[SPLIT VIEW]: DataLoad")
    let arrayOfDocIDs = PlistManager.sharedInstance.getArrayOfValuesFromDict("DocID") as [AnyObject] as! [String]

    for id in arrayOfDocIDs {
        docs.append(DocData(docID: id).docLoad(false))
    }
    print("[SPLIT VIEW] table: \(docs.count)")
}

По этим prints я вижу, что вечер идет хорошо - представление загрузилось в главном представлении, и массив документов записал новый счет. Но tableView не меняется. Спасибо за любую помощь.


person Martina Karbusická    schedule 18.09.2016    source источник
comment
есть ли обновления по этому вопросу?   -  person Julian Silvestri    schedule 22.04.2019


Ответы (1)


С этим кодом

let controller = DocsTableViewController()
controller.tableView.reloadData()

Вы создали новый экземпляр главного контроллера, а не текущий. Есть 2 пути решения:

  1. В Detail Controller создайте ссылку на текущий главный контроллер.

  2. Используйте делегат. Вот хорошее объяснение: https://www.natashatherobot.com/explaining-ios-delegates-a-story-about-your-morning-coffee/#

Надеюсь, это поможет!

person lee5783    schedule 18.09.2016
comment
И как я могу создать ссылку на текущий мастер-контроллер? Я пытался реализовать делегата - я читал статью, которую вы отправили, но она не быстрая. Я попытался реализовать это: ссылка но у меня не работает (расширение имеет проблему с class и пишет ошибку: ожидаемое имя типа в объявлении расширения). - person Martina Karbusická; 18.09.2016
comment
Можете ли вы опубликовать функцию ViewDidLoad главного контроллера? - person lee5783; 18.09.2016
comment
Функция ViewDidLoad Мастера включена в ma Q. По крайней мере, часть, которая имеет отношение к этому. Полная функция слишком длинная для комментариев, поэтому я добавил ее в свой вопрос. - person Martina Karbusická; 18.09.2016
comment
@martina karbusicka привет, у меня точно такая же проблема. Я понял это? - person Lance Samaria; 20.08.2017