Ios 以编程方式返回到不同情节提要中的上一个ViewController

Ios 以编程方式返回到不同情节提要中的上一个ViewController,ios,objective-c,uiviewcontroller,uinavigationcontroller,uistoryboard,Ios,Objective C,Uiviewcontroller,Uinavigationcontroller,Uistoryboard,我在这里尝试了很多答案,但没有一个有相同的确切情况 我正在尝试导航到另一个捆绑包中独立故事板中的UIViewController,到目前为止,我能够导航到它,但无法返回到以前的UIViewController。调用外部视图控制器(TabBarController)的方法实现如下: +(void) launchExternalUI: (UIViewController *) previousViewController { UIStoryboard* sb = [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];
}
- (IBAction)unwindToOriginalViewControllerSegue:(UIStoryboardSegue*)sender {
    ; //TODO: anything special you need, reference via sender
}
TabBarController
中,如果我打印了
self.navigationController
中的所有视图控制器,我所看到的就是
TabBarController
,我不应该看到之前推送它的视图控制器吗
launchExternalUI
[self.navigationController-popViewControllerAnimated:YES]完全无效。我对此有点迷茫

还需要注意的是,
previousViewController
是在本地故事板中定义的,而
TabBarController
是在不同的
.framework
中实现的,这会导致问题吗

提前感谢所有的帮助


**编辑:我需要的导航流程是
storyboard1:VC1->storyboard2:VC2->storyboard1:VC1
,我可以让
storyboard1:VC1->storyboard2:VC2->storyboard1:VC1
部分工作,但不能
storyboard2:VC2->storyboard1:VC1

在原始视图控制器中创建一个展开段,并使用分段,而不是将视图控制器视图推/弹出到视图阵列上

要创建展开序列,应在原始viewcontroller中创建展开方法:

- (void) navigateToPreviousViewController: (UIGestureRecognizer *)gesture {
    [self.navigationController popViewControllerAnimated:YES];
}
- (IBAction)unwindToOriginalViewControllerSegue:(UIStoryboardSegue*)sender {
    ; //TODO: anything special you need, reference via sender
}

然后,在新的viewcontroller中,在情节提要中,从控制器图标拖动到退出图标。将其链接到上面指定的“展开”序列

我经常将项目分成不同的故事板,并创建了一个动态视图控制器,该控制器处理从辅助故事板加载适当控制器的任务,同时维护导航树

我创建了一个示例项目并上传到github,因为这比在这里解释所有步骤都要简单。需要注意的关键部分是Main.stoyboard中每个DynamicStoryBoardViewController的用户定义的运行时属性。还请注意,每个次级情节提要都需要为其中一个ViewController选中“is initial View Controller”。示例中不包括从故事板加载特定场景。这只不过是添加“sceneName”动态运行时属性,与添加storyboardName属性的方式非常相似

这是一个快速的样本,有点粗糙,但你会知道它是如何工作的。如果你陷入困境,请随时提问

干杯

编辑:

我突然意识到,视图层次结构中可能没有navigationController(正如我在示例中所做的那样)。而且在任何情况下,你似乎都无法控制标签栏的位置。因此,如果没有navigationController,[self.navigationController popViewControllerAnimated:YES]将无法工作

您应该对此进行测试,或者像这样调用popViewControllerAnimated,或者调用dismissViewControllerAnimated

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

希望这有帮助,如果没有,也许您可以提供一些示例代码

感谢您的回复,这里唯一的问题是新的视图控制器包含在.framework中,该框架将分布在整个团队中,以集成到不同的项目中,并且需要最少的设置。我希望有一种更简单的方法可以关闭当前的ViewController并返回到前一个,而不管它的结构如何(这里真的错过了android的后退按钮)。检查一些基本信息:您是否在每个故事板中为视图指定了名称?是的,但是框架内的ViewController不一定需要知道是谁调用了它,它应该能够在没有这些信息的情况下自行关闭并返回到以前的视图,就像android的“后退”按钮神奇地为您所做的那样。我可能错了,但我认为第二个ViewController是从位于不同框架中的不同捆绑包中的故事板加载的,这可能是问题的原因?再次感谢您的跟进,非常感谢!我能够返回到上一个UIViewController,方法是将它的引用传递给第二个viewcontroller,然后从第二个viewcontroller执行以下操作:UIWindow*window=[[[UIApplication sharedApplication]delegate]window];window.rootViewController=self.previousViewController;[WindowMakeKeyandVisible];但由于种种原因,这实际上是错误的。对此有进一步的想法吗?您的输入非常有用launchExternalUI方法在哪个类中?什么是previousViewController?感谢您的评论,它是在.framework中的Utils类(NSObject)中定义的类方法。感谢您的回复,我将尝试一下。但我必须指出,如果不进行一些黑客攻击,就不可能做到这一点,这令人感到非常沮丧,我认为我在项目中重用功能的方式(通过创建分离的.frameworks)是完全错误的,或者,苹果真的希望开发者复制粘贴,并通过不断重构故事板来进行大量的重新工作,使所有内容始终在一个故事板中。安卓通过一个简单的后退按钮神奇地解决了一些问题,这些问题必须在iOS中完全解决。好吧,据我所知,你在Main.storyboard上定义了几个动态故事板,你正在从singleViewControllerSB和tabbarControllerSB动态加载它们。在我的例子中,我不想在主情节提要上定义我将链接到不同情节提要的内容,我所需要做的就是从不同情节提要以编程方式启动viewcontroller并能够返回
UIViewController * YourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Storyboard Identifier"];
[self.navigationController pushViewController:YourViewController animated:TRUE];