Из вашего описания звучит так, будто есть три проблемы:
Push-сегменты требуют, чтобы контроллер вида источника был встроен в контроллер навигации - вместо этого у вас есть контроллер вида источника, пытающийся перевести в контроллер навигации.
Контроллер представления назначения также должен быть в раскадровке.
Как только вы используете раскадровки, вы, как правило, не хотите следовать шаблону для выталкивания новых контроллеров представления из мира до раскадровки (то есть, создания контроллера представления и его вставки в tableView:didSelectRowAtIndexPath:
) ... выполнение этого дублирует кучу работы, которую раскадровки делают для вас.
Вместо:
Поместите контроллер табличного представления в контроллер навигации, а контроллер навигации в контроллер представления вкладок. (Это можно сделать с помощью меню «Редактор»> «Встроить в» или перетаскивая их из библиотеки и перетаскивая «взаимосвязанные» соединения между ними.)
Поместите целевой контроллер представления в раскадровку (если его там еще нет), перетащив контроллер представления из библиотеки и установив его класс в свой класс контроллера представления (ConstantRateController
).
Перетащите push-переход из ячейки табличного представления в контроллер представления назначения:
После всех трех шагов ваша раскадровка должна выглядеть следующим образом:
Наконец, в контроллере табличного представления реализуйте следующее:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// test segue.identifier if needed
MyViewController *viewController = segue.destinationViewController;
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
// set properties of viewController based on selection indexPath
}
Segue создает и выдвигает контроллер представления; все, что вам нужно сделать, это настроить его так, чтобы его содержимое отражало выбор таблицы, вызвавший переход. (Обратите внимание, что если у вас есть несколько сегментов от контроллера табличного представления, вы должны присвоить каждому уникальный идентификатор в IB и проверить его в prepareForSegue:sender:
, чтобы сконфигурировать соответствующий целевой контроллер представления.)
Если вам нужно поддерживать несколько сегментов вне табличного представления, в зависимости от того, какая ячейка была выбрана, это немного по-другому. Очевидно, что раскадровка не может знать о ячейках, которые заполнены вашим делегатом / источником данных, поэтому вы не можете настраивать сегменты из ячейки ... по крайней мере, не в динамической таблице.
Звучит так, будто вы можете быть чем-то вроде представления «Настройки», где у вас есть статический набор ячеек, каждый из которых должен переходить к другому представлению (например, на какую-то страницу настроек). В этом случае вы можете захотеть взглянуть на другую функцию, которую вы получаете из раскадровок: статические таблицы . Если вы выбираете табличное представление (а не контроллер табличного представления) в IB, то в верхней части инспектора атрибутов можно переключаться между динамическими прототипами и статическими ячейками - первое - это то, что я описал выше, а второе - создание ячеек. и разделы и редактировать их содержание полностью в IB. С помощью статических ячеек вы можете сделать разные переходы от каждого ... так что вы можете сделать многостраничный пользовательский интерфейс, похожий на настройки, почти полностью в IB (конечно, вам все равно понадобится код, чтобы что-то делать, когда переключатели переключаются и еще много чего) ).
Если вам нужно поддерживать несколько сегментов из динамической таблицы, вам понадобятся две вещи:
Другой источник для сегментов - вы не можете иметь несколько сегментов, выходящих из ячейки, но вы можете иметь несколько сегментов, выходящих из самого (табличного) контроллера представления.
Логика выбора перехода на основе действий пользователя. Здесь мы возвращаемся к tableView:didSelectRowAtIndexPath:
, но вместо того, чтобы создавать новый контроллер представления и помещать его в навигационный контроллер или представлять его модально, вы просто вызываете performSegueWithIdentifier:
на self
.
В этом ответе есть чуть больше подробностей , а в общих сведениях о программировании раскадровок - Руководство по контроллерам представлений Apple :