Проблемы с настройкой контроллера навигации с помощью Story Board - PullRequest
5 голосов
/ 02 апреля 2012

Я настраивал Navigation Controller ранее в предыдущих версиях XCode, но я использую последнюю версию и пытаюсь настроить его с помощью Story Board.У меня есть Tab Bar Controller, который питает две формы.Вторая форма имеет вид UITableview, который я хочу затем переместить в другую форму, когда пользователь сделал выбор с помощью контроллера навигации.Ниже я изложил, как выглядят мои отношения.

enter image description here

Кажется, проблема в том, что мои отношения установлены.Я управлял переходом со второй формы к контроллеру навигации, и во всплывающем окне предлагается выбор из «Push, Modal или Custom».Я выбрал «Push», но когда я пытаюсь запустить приведенный ниже код, он не работает.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
     NSUInteger row = [indexPath row];
     NSString *tSel = [listContents objectAtIndex:row];

     ConstantRateController *detailController = [[ConstantRateController alloc] initWithNibName:@"ConstantRateController_iPhone" bundle:nil];        
     [self.navigationController pushViewController:detailController animated:YES]
 }

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

Ответы [ 4 ]

9 голосов
/ 02 апреля 2012

Из вашего описания звучит так, будто есть три проблемы:

  1. Push-сегменты требуют, чтобы контроллер вида источника был встроен в контроллер навигации - вместо этого у вас есть контроллер вида источника, пытающийся перевести в контроллер навигации.

  2. Контроллер представления назначения также должен быть в раскадровке.

  3. Как только вы используете раскадровки, вы, как правило, не хотите следовать шаблону для выталкивания новых контроллеров представления из мира до раскадровки (то есть, создания контроллера представления и его вставки в tableView:didSelectRowAtIndexPath:) ... выполнение этого дублирует кучу работы, которую раскадровки делают для вас.

Вместо:

  1. Поместите контроллер табличного представления в контроллер навигации, а контроллер навигации в контроллер представления вкладок. (Это можно сделать с помощью меню «Редактор»> «Встроить в» или перетаскивая их из библиотеки и перетаскивая «взаимосвязанные» соединения между ними.)

  2. Поместите целевой контроллер представления в раскадровку (если его там еще нет), перетащив контроллер представления из библиотеки и установив его класс в свой класс контроллера представления (ConstantRateController).

  3. Перетащите push-переход из ячейки табличного представления в контроллер представления назначения:

drag to create segue

После всех трех шагов ваша раскадровка должна выглядеть следующим образом:

enter image description here

Наконец, в контроллере табличного представления реализуйте следующее:

- (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 (конечно, вам все равно понадобится код, чтобы что-то делать, когда переключатели переключаются и еще много чего) ).

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

  1. Другой источник для сегментов - вы не можете иметь несколько сегментов, выходящих из ячейки, но вы можете иметь несколько сегментов, выходящих из самого (табличного) контроллера представления.

  2. Логика выбора перехода на основе действий пользователя. Здесь мы возвращаемся к tableView:didSelectRowAtIndexPath:, но вместо того, чтобы создавать новый контроллер представления и помещать его в навигационный контроллер или представлять его модально, вы просто вызываете performSegueWithIdentifier: на self.

В этом ответе есть чуть больше подробностей , а в общих сведениях о программировании раскадровок - Руководство по контроллерам представлений Apple :

2 голосов
/ 02 апреля 2012

Обычно, когда вы хотите использовать Nav Controller, вы должны встраивать его ...

Xcode содержит отличный способ добавления контроллеров панели навигации и панели вкладок - хотя он немного скрытдалеко.Сначала выберите контроллер представления и перейдите в меню «Редактор» -> «Вставить» -> «Контроллер панели вкладок».Xcode автоматически создаст наш новый контроллер и свяжет существующий контроллер представления.Опять же, выберите View Controller и на этот раз перейдите в меню Editor -> Embed In -> Navigation Controller.Вы увидите, что Xcode вставляет новый контроллер навигации между контроллером панели вкладок и контроллером представления.Очень хорошо - пока так хорошо!Ваши взгляды должны выглядеть следующим образом ...

[от: http://maybelost.com/2011/10/tutorial-storyboard-in-xcode-4-2-with-navigation-controller-and-tabbar-controller-part1/]

0 голосов
/ 01 февраля 2014

вы видите три segues («Push, Modal или Custom») и не видите «контроллер корневого представления», если ваш контроллер навигации конвертирован из обычного ViewController путем изменения его CUSTOM CLASS.Да, он называется «Навигационный контроллер в Storyboad.Но его желтый значок отличается.Ему не хватает раздела «Navigation Controller» в свойствах, и он НЕ работает как Navigation Controller.Это можно исправить, изменив исходный XML-файл файла раскадровки.Это действительно сбивает с толку, почему они называют это "вставлять" ..

0 голосов
/ 02 апреля 2012

попробуйте удалить метод "loadView" и оставьте viewDidLoad в классе ViewController, который вы хотите показать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...