Подтвердить что ты не робот

Изменить UIViewController на UITableViewController внутри раскадровки?

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

Я не могу использовать статические представления таблиц в UIViewController (Static table views are only valid when embedded in UITableViewController instances). Итак, мне нужно каким-то образом преобразовать существующий UIViewController в UITableViewController. Я изменил родительский файл .h, но это еще не сделано.

Есть ли другой способ добиться этого? Мне действительно не нужно было бы создавать новый VC в раскадровке и перебирать все, это большая проблема.

4b9b3361

Ответ 1

Если вы хотите, чтобы ваше статическое представление таблицы ячеек не занимало весь экран, то использование контейнера - это самый простой способ. Начните с обычного UIViewController и перетащите представление контейнера (рядом с обычным UIView в списке объектов) в его представление. Измените его, но вы хотите - раскадровка автоматически предоставит контроллер вида, подключенный к этому представлению контейнера, с помощью встроенного сегмента. Удалите этот контроллер, перетащите контроллер табличного представления и перетащите правую сторону из представления контейнера в этот контроллер табличного представления, чтобы создать новый встроенный сегмент. Доступ к этому контроллеру табличного представления можно получить из UIViewController с его свойством childViewControllers (и, наоборот, вы можете получить доступ к UIViewController из контроллера табличного представления с помощью parentViewController, если вам нужно).

Ответ 2

Я добавлю к этому, поскольку вопрос заключается в том, как изменить UIViewController в UITableViewController и учитывая, что этот вопрос старше года и оригинальный ответ, хотя он действителен и может быть или не быть единственным решение в то время, фактически не отвечает на вопрос и не является единственным решением.

Это можно сделать, вам просто нужно настроить делегат табличного представления и источники данных в IB и вручную отредактировать XML раскадровки, что звучит страшно, но на самом деле очень просто.

Сначала измените родительский класс как UITableViewController. UITableViewController уже использует UITableViewDatasource и UITableViewDelegate протоколы, поэтому, если ваш класс тоже делает это, вы можете удалить их:

@implementation MyTableViewController : UITableViewController
...
@end

Затем создайте новые реферирующие точки в своем UITableView для своего источника данных и делегирования. Самый простой способ сделать это - перетащить из UITableView в себя. Всплывающее окно предоставит вам параметры dataSource и делегата.

Наконец, вам нужно изменить XML-раскладку. Файл раскадровки может стать довольно большим довольно быстро. Самый простой способ найти сцену, которую вы ищете, - установить идентификатор раскадровки в инспекторе идентификации. Чтобы напрямую просмотреть XML, щелкните правой кнопкой мыши файл раскадровки в навигаторе проекта и выберите "Открыть как → Исходный код". Теперь просто выполните поиск того, что вы установили для повторного использования ранее. Вы увидите что-то похожее на это:

<!-- My Table View Controller -->
<scene sceneID="EuE-XX-cCb">
  <objects>
    <viewController storyboardIdentifier="MY_TABLE_VIEW_IDENTIFIER" ... >
      // Lots of other stuff
    </viewController>
  </objects>
</scene>

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

<viewController>
</viewController>

вместо этого будет tableViewController

<tableViewController>
</tableViewController>

Что это! Нет необходимости создавать новую сцену UITableViewController или встраивать UITableViewController в представление контейнера.

EDIT:

Я также должен добавить, что UITableView ДОЛЖЕН быть корневым представлением. Он не может быть встроен в другой UIView.

Ответ 3

Что я сделал, создается UITableViewController в IB, открываем раскадровку с помощью текстового редактора и копируем все узлы внутри из UIViewController в UITableViewController.

Я думаю, что таким образом существует меньше риска для удаления чего-то важного.

Перед копированием объектов разделов убедитесь, что оба вида таблиц (UIViewController и UITableViewController) имеют одинаковые свойства, такие как: статические или динамические ячейки, стиль (простой или сгруппированный) и т.д.