2017-01-31 2 views
0

У меня есть статическиеUITableView с n столбцы и 1 раздел. Клетки детализированы с некоторым динамическим контентом, переданным от другого UIViewController.
Мое решение заключается в следующем: я делаю вызов в viewDidAppear представить динамический контент и в конечном итоге перезарядить вид:Быстрое рендеринг статических ячеек с динамическим контентом

override func viewDidAppear(_ animated: Bool) { 
     setupDetails() 
    } 

fileprivate func setupDetails() { 
     tableView.cellForRow(at: [0,0] as IndexPath)?.detailTextLabel?.text = "..." 
     tableView.cellForRow(at: [0,1] as IndexPath)?.detailTextLabel?.text = "..." 
     // .... multiple cells 

     tableView.reloadData() 
    } 

Что мне не нравится, что содержание обновляется после того, как вид показан для пользователя (благодаря звонку viewDidAppear).
Что касается работы с методом cellForRow(), я не мог бы работать с ним, учитывая тот факт, что ячейка статически создана на моей раскадровке.
Вопрос в том, существует ли шаблон, который будет использоваться в этом конкретном случае, о котором я не думал. В основном я хочу, чтобы представление было загружено до представления представления, как будто я работал с динамическими ячейками.

ответ

1

Мой вопрос, если существует шаблон для использования в данном конкретном случае

Да. Не используйте статическую таблицу. Ваш стол не статический! «Статический» означает «никогда не меняется». Ваша таблица противоположна статике; это . изменение. Это динамично!

Итак, используйте обычную динамическую таблицу. Ведите модель данных, с которой консультируются Три Больших Вопроса (методы источника данных). Чтобы обновить таблицу новыми данными, сначала обновите модель данных, а затем позвоните по номеру reloadData. Это приведет к тому, что cellForRowAt до будет называться, и вы будете заполнять каждую ячейку из модели данных. То есть много более эффективно, чем то, что вы делаете.

Что касается вспышки, это всего лишь вопрос времени; используйте viewWillAppear вместо viewDidAppear.

+0

Спасибо за ваш ответ, когда я имел в виду статичный, я предполагал, что количество ячеек не меняется, вместо этого меняется ячейка 'detail label'. Причина, по которой я не использую динамический 'tableView', заключается в том, что я хочу настроить эту ячейку по-разному в своей раскадровке (учитывая, что количество отображаемых ячеек не изменяется), например. 'sliders',' textfield' и т. д. Проблема с 'viewWillAppear' заключается в том, что с моей текущей реализацией' cellForRow() 'возвращает нуль в это время, поэтому я не могу выполнять свои обновления. Предлагаете ли вы создать статическую структуру в качестве источника данных для динамической таблицы? – r4id4

+0

Несмотря на то, что вы говорите, то, что вы описываете, представляет собой динамическое представление таблицы. Похоже, вы просто ленитесь (не значит обижаться, мы все ленивы, это добродетель!). Укусите пулю и сделайте это правильно. Используйте обычный UITableView с источником данных и делегированием и выполняйте всю работу по настройке в источниках данных и делегировании. Если у вас есть сложные типы ячеек, используйте подклассы UITableViewCell и создавайте их, если хотите, в раскадровке в виде разных прототипов или используйте файлы _.xib_. – matt

+0

Никакого оскорбления не было :) Я просто не совсем согласен с тем, что вы говорите, я связал динамичность UITableView с неизвестным количеством строк, представленным, а не чисто по содержанию!На мой взгляд, статическая таблица по определению является той, что находится в приложении «Настройки» (iOS) с предопределенным количеством строк, но если вы включаете/выключаете Wi-Fi/Bluetooth, вы получаете обратную связь в связанной ячейке «detailLabel», которая отображает Текущее состояние. Это в основном тот же вариант использования, который у меня есть, ядро ​​ядра одинаково, изменяющимся компонентом является статус (т.е. 'detailLabel'). Скажите, если я ошибаюсь. – r4id4

1

Не используйте ViewDidAppear, если вы не хотите, чтобы вы меняли, чтобы показать пользователю. Используйте ViewWillAppear, и представление уже будет в конечном состоянии, когда пользователь сначала его увидит.

+0

С моей текущей реализацией это не работает, ведь на 'viewWillAppear' tableView еще не загружен, поэтому мой' tableView.cellForRow() 'возвращает нуль. Это основная причина моего вопроса :) – r4id4

+0

Не используйте tableView для доступа к вашим полям. Ctrl + перетаскивание точек в поля непосредственно в UITableViewController, если это статический tableView –

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