#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. итак, чем это отличается от IBOutlet? И как я могу использовать их в своих собственных контроллерах?
2. Когда вы создаете переход, это позволяет вам указать идентификатор. Вы используете этот идентификатор, чтобы проверить, используется ли этот переход в данный момент для перехода с одного контроллера (или любого другого) на другой. На самом деле вы не используете их каким-либо другим способом — поэтому в этом отношении они отличаются от IBOutlets. Они также используются для определения того, как продвигать новое представление (push / modal / popover и т.д.). Учебные пособия, на которые я ссылался, показывают, как использовать их в ваших собственных контроллерах.
3. Обновлены ссылки на руководство, которые недавно были удалены после переноса сайта. Я предполагаю, что это причина необъяснимого / необоснованного голосования против.