以编程方式返回到不同故事板中的上一个View Controller

时间:2014-09-19 17:28:26

标签: ios objective-c uiviewcontroller uinavigationcontroller uistoryboard

我在这里尝试了很多答案,但没有一个具有相同的确切情况。

我正在尝试导航到位于不同捆绑包中的单独故事板内的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

3 个答案:

答案 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];