我在这里尝试了很多答案,但没有一个具有相同的确切情况。
我正在尝试导航到位于不同捆绑包中的单独故事板内的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
中,如果我打印self.navigationController
中的所有视图控制器,我看到的只是TabBarController
,我不应该看到先前的视图控制器在{{1}上推送它}? launchExternalUI
根本没有效果。我对此感到有些失落。
同样重要的是要注意[self.navigationController popViewControllerAnimated:YES];
是在本地故事板中定义的,previousViewController
是在不同的TabBarController
中实现的,会导致问题吗?
提前感谢所有帮助!
**修改:我需要的导航流程是.framework
,我可以让storyboard1:VC1->storyboard2:VC2->storyboard1:VC1
部分工作,但不能storyboard1:VC1->storyboard2:VC2
答案 0 :(得分:3)
我经常将项目拆分为各种故事板,并创建了一个动态视图控制器,用于处理从辅助故事板加载适当控制器的任务,同时维护导航树。
我已经创建了一个示例项目并上传到github,因为它比解释这里的所有步骤更容易。需要注意的关键部分是Main.stoyboard中每个DynamicStoryboardViewControllers的用户定义的运行时属性。另请注意,每个辅助故事板都需要为其中一个viewControllers选中“是初始视图控制器”。示例中不包括从故事板加载特定场景。这只不过是添加“sceneName”动态运行时属性,就像添加storyboardName属性一样。
这是一个快速的样本,所以有点粗糙,但你会明白它是如何工作的。如果你遇到困难,请随时提问。
干杯!
编辑:
我突然意识到你可能在视图层次结构中没有一个navigationController(正如我在我的示例中所做的那样)。无论如何,您似乎无法控制标签栏的引入位置。因此,如果没有navigationController,[self.navigationController popViewControllerAnimated:YES]将无效;
你应该测试一下,然后像你一样调用popViewControllerAnimated,或者调用dismissViewControllerAnimated;
if(self.navigationController){
[self.navigationController popViewControllerAnimated:YES];
}else{
[self.presentingViewController dismissViewControllerAnimated:Yes completion:nil];
}
希望这有帮助,如果没有,也许你可以提供一些示例代码。
答案 1 :(得分:0)
在原始视图控制器中创建展开segue,并使用segues而不是将视图控制器视图推送/弹出到视图数组上。
要创建展开segue,您应该在ORIGINAL viewcontroller中创建一个展开方法:
- (IBAction)unwindToOriginalViewControllerSegue:(UIStoryboardSegue*)sender {
; //TODO: anything special you need, reference via sender
}
然后,在您的新视图控制器中,在故事板中,从控制器图标拖动到“退出”图标。链接到Unwind segue你在上面命名。
答案 2 :(得分:0)
UIViewController * YourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Storyboard Identifier"];
[self.navigationController pushViewController:YourViewController animated:TRUE];