1

Я пробовал много ответов здесь, но ни один из них не имел одинакового точного сценария.Программно вернуться к предыдущему ViewController в другой раскадровке

Я пытаюсь перейти к UIViewController, который находится в отдельной раскадровке в другом комплекте, до сих пор мне удалось перейти к нему, но я не смог вернуться к предыдущему UIViewController. Метод, который вызывает контроллер внешнего вида (TabBarController) реализуется следующим образом:

+(void) launchExternalUI: (UIViewController *) previousViewController { 
    UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: [self frameworkBundle]]; 
    TabBarController *vc = (TabBarController*) [sb instantiateInitialViewController]; 
    [previousViewController.navigationController pushViewController:vc animated:YES]; 
    [vc release]; 
} 

Теперь метод в пределах TabBarController, который должен вернуться к предыдущему контроллеру Вид:

- (void) navigateToPreviousViewController: (UIGestureRecognizer *)gesture { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

В TabBarController, если печать все viewcontrollers в пределах self.navigationController, все, что я вижу, это TabBarController, не должен ли я видеть предыдущий контроллер представления, который нажал это на launchExternalUI? [self.navigationController popViewControllerAnimated:YES]; не имеет никакого эффекта. Я немного потерял это.

Также важно заметить, что previousViewController определен в локальной раскадровке, а TabBarController реализован в другом .framework, это может вызвать проблему?

Заранее благодарим за помощь!

** Edit: Поток навигации мне нужно storyboard1:VC1->storyboard2:VC2->storyboard1:VC1, я могу получить storyboard1:VC1->storyboard2:VC2 часть работы, но не storyboard2:VC2->storyboard1:VC1

+0

В каком классе находится метод launchExternalUI? Что такое предыдущий контроль? – rdelmar

+0

Спасибо за комментарий, это метод класса, определенный в классе Utils (NSObject) внутри .framework. – dorbsz

ответ

0

Создать разматывания SEGUE в пределах исходного контроллера представления, а также использование перетекает вместо толкания/выскакивают просматривать представления контроллера на массив представлений.

Чтобы создать разматывание SEGUE вы должны создать разматывание метод в ОРИГИНАЛЕ ViewController:

- (IBAction)unwindToOriginalViewControllerSegue:(UIStoryboardSegue*)sender { 
    ; //TODO: anything special you need, reference via sender 
} 

Тогда, в вашем новом ViewController, в раскадровке, перетаскивание с помощью значка контроллера на иконку Выхода. Свяжите это с Unwind segue вы назвали выше.

+1

Спасибо за ответ, единственная проблема здесь в том, что NEW view controller содержится в фреймворке, который предназначен для распространения по всей команде для интеграции в разные проекты и требует минимальной настройки. Я бы ожидал, что будет проще убрать текущий ViewController и вернуться к предыдущему, независимо от того, как он структурирован (действительно, здесь пропустите кнопку андроида). – dorbsz

+0

Проверка некоторых основ: присвоили ли вы имя своим представлениям в каждой раскадровке? –

+0

простите меня, если это слишком просто. Я допустил эту ошибку до ... –

3

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

Я создал образец проекта и загрузил его в github, поскольку это проще, чем объяснять все шаги здесь. Ключевой частью, которую следует отметить, является атрибут Runtime User Defined Runtime для каждого из DynamicStoryboardViewControllers в Main.stoyboard. Обратите также внимание на то, что для каждой из вторичных раскадровки необходим «начальный контроллер просмотра», проверенный для одного из ваших контроллеров просмотра. В этот пример не входит загрузка определенной сцены из раскадровки. Это не более чем добавление атрибута динамической среды выполнения «sceneName» так же, как и атрибут storyboardName.

Это быстрый образец, так что немного грубо, но вы получите представление о том, как все это работает. Не стесняйтесь задавать вопросы, если вы застряли.

Cheers!

EDIT:

осенило меня, что, возможно, вы не имеете navigationController в иерархии представлений (как и я в моем примере). И в любом случае, похоже, у вас не будет большого контроля над тем, где вводится панель вкладок. Таким образом, без navigationController [self.navigationController popViewControllerAnimated: YES] не будет работать;

Вы должны проверить это и либо вызвать popViewControllerAnimated, как и вы, либо вызвать rejectViewControllerAnimated;

if(self.navigationController){ 
     [self.navigationController popViewControllerAnimated:YES]; 
    }else{ 
     [self.presentingViewController dismissViewControllerAnimated:Yes completion:nil]; 
    } 

Надеюсь, что это поможет, если нет, возможно, вы можете предоставить образец кода.

+0

Спасибо за ваш ответ, я попробую это. Но я должен упомянуть, что это потрясающе расстраивает то, что нет никакого способа сделать это без какого-либо взлома, я бы предположил, что я полностью ошибаюсь в том, как я повторно использую функциональность в своем проекте (путем создания разделенных .frameworks) или Apple действительно ожидает, что разработчики будут копировать-вставлять и делать кучу повторной работы, сохраняя рефакторинг раскадровки, чтобы все в одной раскадровке ВСЕГДА. То, что андроид волшебным образом решает, имея простой back-button, должен быть полностью взломан в iOS. – dorbsz

+0

ОК, из того, что я понял, вы определяете несколько динамических раскадровки на вашей Main.storyboard, и вы динамически загружаете их из singleViewControllerSB и tabbarControllerSB. В моем случае я не хочу определять на MainStoryBoard, что я буду ссылаться на разные раскадровки, все, что мне нужно сделать, - это программно запустить viewcontroller из другой раскадровки и иметь возможность вернуться к контроллеру представления, который назвал это после того, как я покончил с этим, разве это невозможно? – dorbsz

+0

Нет, я создаю динамический контроллер представления, передавая имя раскадровки, к которой я хочу перейти в атрибутах времени выполнения. И да, это возможно, как показывает мой образец. – MDB983

0
UIViewController * YourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Storyboard Identifier"]; 
[self.navigationController pushViewController:YourViewController animated:TRUE]; 
Смежные вопросы