Вызов reloadData () для refre sh TableView - многоразовый код - PullRequest
0 голосов
/ 02 августа 2020

Мне нужно, чтобы tableView выполнял reloadData () после того, как строка была добавлена ​​через textView. Все мои tableViews используют повторно используемый код, который отлично работает. Ниже мой многоразовый TableViewCode.

class ReusableSubtitleTable: NSObject, UITableViewDataSource, UITableViewDelegate{
        let cell = "cell"
        var dataArray = [String]()
        
        func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) {
            print("DataArray count from table view = \(dataArray.count)")
            return dataArray.count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let selfSizingCell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! SelfSizingCell
            let num = indexPath.row
            selfSizingCell.titleText.text = (stepText[num])
            selfSizingCell.subtitleText.text = dataArray[num]
            return selfSizingCell
        }
    }

В приведенной ниже функции используется многоразовый код для отображения таблицы, которая отлично работает.

class DetailViewController: UIViewController {
     
    let step = 13
    var tableView: UITableView!
    let dataSource = ReusableSubtitleTable()
    var selectedEntry: JournalEntry!
    var dataModel = [String]()
    var didSave = false
    var coreDataManager = CoreDataManager()
     
     override func viewDidLoad() {
            super.viewDidLoad()
            tableView.delegate = dataSource
            tableView.dataSource = dataSource
            dataSource.dataArray = dataModel
     
    @IBAction func unwindToDetail( _ sender: UIStoryboardSegue) {
            dataModel[10] = step11
            didSave = coreDataManager.updateEntry(step11: step11, selectedEntry: selectedEntry)
}
}

Проблема возникает, когда пользователь хочет добавить к последний ряд. Пользователь нажимает кнопку и переходит к следующему контроллеру, который является TextView. Когда пользователь заканчивает ввод, он нажимает кнопку «Сохранить», которая возвращается в DetailViewController через раскрутку. SelectedEntry сохраняется, а dataModel обновляется. Теперь необходимо перезагрузить представление таблицы, чтобы отобразить этот добавленный текст.

Я пробовал добавить tableView.ReloadData () после didSave. Я попробовал Dispatch и попытался сохранить данные перед возвратом из textView через размотку, но это тоже не работает.

Я попытался добавить приведенную ниже функцию в ReusableTableView и вызвал ее после обновления coredata - там ошибок нет, но таблица не перезагружается.

   func doReload(){
       tableView.reloadData()
    }

Я проверил, что данные сохранены, и они отображаются, если я возвращаюсь к контроллеру сводки, а затем go пересылаю DetailViewController.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 02 августа 2020

Размещение UITableView reloadData() внутри viewWillAppear или viewDidAppear должно решить эту проблему.

Например:

func viewDidAppear(_ animated: bool) {
    super.viewDidAppear(animated)
    tableView.reloadData()
}

Это потому, что иерархия представлений не пока не считается "видимым" во время раскрутки перехода, и почему вы видите, что это работает, вернувшись к перезагрузке контроллера представления. Функция reloadData(), для эффективности, повторно отображает только видимые ячейки, и во время раскрутки ячейки не «видны».

Документация Apple - UITableView.reloadData () :

Для повышения эффективности в табличном представлении повторно отображаются только те строки, которые видны.

...