Как выполнить переход с программно загруженной раскадровкой? - PullRequest
2 голосов
/ 06 января 2012

Мне нужно выполнить переход с моей раскадровки. Метод для вызова в этом случае -[UIViewController performSegueWithIdentifier:sender:]. Этот метод использует свойство storyboard UIViewController для поиска раскадровки (и, следовательно, перехода).

Однако свойство storyboard не устанавливается, если UIViewController не было создано из раскадровки. И поскольку он доступен только для чтения, я не могу установить его программно, где я загружаю свою раскадровку.

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

Если это невозможно, возможно, это из-за того, что моя архитектура неверна. Вот пример использования:

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

Однако одна огромная раскадровка не кажется хорошей идеей: она предотвратит постепенные изменения в приложении, будет громоздкой, что затруднит для членов команды самостоятельную работу над вкладкой.

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

До сих пор я подходил к основному файлу nib, содержащему UITabBarController и каждый из его основных дочерних контроллеров представления. Контроллеры дочерних представлений загружают свои раскадровки по методу viewDidLoad. И оттуда они не могут выполнить свою передачу.

Альтернативой может быть создание дочерних контроллеров представления из их раскадровок, но тогда как я могу подключить их к UITabBarController? И куда мне программно загрузить раскадровки?

Спасибо за любые предложения.

1 Ответ

0 голосов
/ 22 мая 2012

сделать ссылку на segue и сохранить значение указателя в одноэлементном классе. Затем, используя ссылку на указатель, сохраненную в синглтон-классе, получите доступ к segue где угодно и загрузите его. Вот пример кода, в котором я загружаю представление segue из одного класса раскадровки, но каждое представление имеет отдельные файлы контроллеров представления .h и .m, которые имеют соответствующие соединения. (Я использовал формальный протокол, поэтому строка shareVC.delegate = self; есть.

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue isKindOfClass:[UIStoryboardPopoverSegue class]]) {
if (self.currentPopover != nil) {
[_currentPopover dismissPopoverAnimated:YES];
 self.currentPopover = nil;
}

    UIStoryboardPopoverSegue *popSegue = (UIStoryboardPopoverSegue *)segue;
    self.currentPopover = popSegue.popoverController;
}

if ([segue.identifier compare:@"ShareModal"] == NSOrderedSame) {
    //the share controller is being presented modally, probably iphone

    UINavigationController *shareNavController = segue.destinationViewController;
    myViewController *shareVC = (myViewController *)[shareNavController topViewController];

    shareVC.delegate = self;


}  else if ([segue.identifier compare:@"SharePopover"] == NSOrderedSame) {


    FollowersViewController *followerVC = segue.destinationViewController;
    followerVC.delegate = self;



}  else if ([segue.identifier compare:@"StartScreenSegue"] == NSOrderedSame) {

UINavigationController *startNavController = segue.destinationViewController;
StartViewController *startVC = (StartViewController *)startNavController.topViewController;
startVC.delegate = self;
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationOpenUrlNotification object:nil];
    }
}

Надеюсь, это поможет:)

...