Взаимосвязь между раскадровкой в iOS

#objective-c #ios #xcode4 #ios5 #uistoryboard

#objective-c #iOS #xcode4 #ios5 #uistoryboard

Вопрос:

Я пытаюсь использовать новую функцию раскадровки, однако меня смущают взаимосвязи раскадровки? Чем они отличаются от IBOutlets?

Также как я могу добавить свою собственную взаимосвязь в мой собственный подкласс UIViewController?

Я пытался заглянуть в документацию, но не могу найти о них много.

Ответ №1:

Насколько я понимаю, отношения — это способ представления в iOS отношений «родитель-потомок», и хотя это кажется довольно рекурсивным, примером взаимосвязи родитель-потомок является контейнер UIViewController, содержащий UIViewController.

В любом случае, это теория — ее лучше понять с помощью UINavigationController. Это называется «контейнером», потому что в метафоре «стека» он содержит столько обычных UIViewControllers, что вы можете выполнять свои обычные детализации UITableView и всплывающие окна.

Ключевым моментом является то, что между UINavigationController и первым UIViewController в вашем стеке существует «взаимосвязь», в то время как переход между всеми остальными UIViewControllers — это просто обычный push-переход.

То же самое очевидно и в UISplitViewController — для запуска ему нужны два контроллера просмотра (иногда называемые контроллерами просмотра содержимого), и они подключены между родительским UISplitViewController (контейнером) и двумя обычными контроллерами просмотра содержимого

(таким образом, взаимосвязи не похожи на IBOutlets, а больше похожи на segues — они даже находятся в категории ‘segues’ стандартных контейнеров view controller)

Теперь — нам не разрешено создавать подклассы стандартных контейнеров view controller, но нам разрешено создавать пользовательские контейнеры view controller, но я ни за что на свете не смогу определить взаимосвязь в моем пользовательском контейнере view controller!!!!!!!!!!!

итак: «могу ли я использовать их в своих собственных контроллерах?» ответ пока неизвестен (по крайней мере, для меня, а документация в лучшем случае скудная)

Ответ №2:

Создайте подкласс UIStoryboardSegue, подобный этому:

 @implementation JTARelationshipSegue

- (void)perform
{
  return;
}

@end
  

Создайте пользовательский переход между вашими двумя объектами и задайте класс как JTARelationshipSegue. В вашем контроллере представления заставьте контроллер представления выполнять переход следующим образом:

 - (void)viewDidLoad
{
  ...
  [self performSegueWithIdentifier:@"addChild" sender:self];
}
  

Для идентификатора segues в interface Builder необходимо установить значение addChild.

Улучшите prepareForSegue:sender так, чтобы он добавлял целевой контроллер представления segues в качестве дочернего элемента текущего контроллера представления, вот так:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
  UIViewController *destination = [segue destinationViewController];
  [self addChildViewController:destination];
  ...
}
  

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

Это сделает ваш файл раскадровки более красивым и читаемым, однако, возможно, вам лучше просто загрузить другие ваши контроллеры просмотра и добавить их в качестве дочерних элементов в вашем методе view did load:

 - (void)viewDidLoad
{
   [self addChildViewController:
         [[self storyboard] 
          initiateViewControllerWithIdentifier:@"myIdent"]];
...
}
  

Комментарии:

1. Это довольно умно, хотя и не кажется на 100% правильным способом использования перехода. Я не думаю, что UINavigationController делает это, чтобы раскрыть связь RootViewController… но кто знает.

2. Это полностью работает, и теперь я подключаю соединения в моей раскадровке для удобства чтения с помощью вашего метода.

Ответ №3:

Я написал несколько руководств о том, как использовать раскадровки на моем сайте…

Часть 1 руководства

Часть 2 руководства

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

Комментарии:

1. итак, чем это отличается от IBOutlet? И как я могу использовать их в своих собственных контроллерах?

2. Когда вы создаете переход, это позволяет вам указать идентификатор. Вы используете этот идентификатор, чтобы проверить, используется ли этот переход в данный момент для перехода с одного контроллера (или любого другого) на другой. На самом деле вы не используете их каким-либо другим способом — поэтому в этом отношении они отличаются от IBOutlets. Они также используются для определения того, как продвигать новое представление (push / modal / popover и т.д.). Учебные пособия, на которые я ссылался, показывают, как использовать их в ваших собственных контроллерах.

3. Обновлены ссылки на руководство, которые недавно были удалены после переноса сайта. Я предполагаю, что это причина необъяснимого / необоснованного голосования против.