Изменить UIViewController на UITableViewController внутри раскадровки?
Я сделал вид в своем раскадровке, который теперь решил, что лучше отображать его данные через статические ячейки таблицы.
Я не могу использовать статические представления таблиц в UIViewController
(Static table views are only valid when embedded in UITableViewController instances
). Итак, мне нужно каким-то образом преобразовать существующий UIViewController
в UITableViewController
. Я изменил родительский файл .h, но это еще не сделано.
Есть ли другой способ добиться этого? Мне действительно не нужно было бы создавать новый VC в раскадровке и перебирать все, это большая проблема.
Ответы
Ответ 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) имеют одинаковые свойства, такие как: статические или динамические ячейки, стиль (простой или сгруппированный) и т.д.