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,如果我打印所有我看到的self.navigationController中的视图控制器都是TabBarController,我不应该看到前面的视图控制器在launchExternalUI上推动了这个吗? [self.navigationController popViewControllerAnimated:YES];根本没有效果。我对此有点失落。

重要的是要注意previousViewController在本地故事板中定义,而TabBarController在不同的.framework中实现,是否会导致此问题?

在此先感谢您的帮助!

**编辑:导航流量我需要的是storyboard1:VC1->storyboard2:VC2->storyboard1:VC1,我能得到storyboard1:VC1->storyboard2:VC2一部分工作,但不是storyboard2:VC2->storyboard1:VC1

+0

launchExternalUI方法在哪个类中?什么是previousViewController? – rdelmar 2014-09-19 20:03:21

+0

感谢您的评论,它是在.framework中的Utils类(NSObject)中定义的类方法。 – dorbsz 2014-09-19 21:04:47

回答

0

创建原始视图控制器内的开卷SEGUE和使用塞格斯,而不是推/弹出将视图控制器视图添加到视图数组。

要创建一个展开赛格瑞你应该在原来的ViewController创建的展开方法:

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

然后,在新的ViewController,在故事板,从控制器图标,退出图标拖动。链接到您在上面命名的Unwind segue。

+1

感谢您的答复,这里唯一的问题是,新的视图控制器包含在一个.framework中,这意味着分布在整个团队中,以便集成到不同的项目中,并且应该要求最低限度的设置。我希望有一种更简单的方法可以关闭当前的ViewController并返回到前一个ViewController,而不管它是如何构造的(真的错过了Android的后退按钮)。 – dorbsz 2014-09-19 18:30:21

+0

检查一些基础知识:你是否在每个故事板中为你的视图分配了一个名称? – 2014-09-19 18:43:23

+0

原谅我,如果这太基本了。我已经犯了...... – 2014-09-19 18:51:24

3

我经常将项目拆分成各种故事板,并创建了一个动态视图控制器,用于处理从辅助故事板加载相应控制器的任务,同时维护导航树。

我创建了一个示例项目并上传到github,因为它比解释这里的所有步骤更简单。要注意的关键部分是Main.stoyboard中每个DynamicStoryboardViewController的用户定义运行时属性。还要注意,每个次要故事板都需要为你的一个viewControllers检查“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]; 
    } 

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

+0

感谢您的回复,我会尝试一下。但是我不得不提及,如果没有一些黑客行为,没有办法做到这一点令人惊讶,我会假设我在我的项目中重复使用功能的方式(通过创建分离的.frameworks)完全错误,或者苹果真的希望开发人员能够复制粘贴,并通过保持重构故事板将所有内容放在一个故事板中来做一些重新工作。通过简单的后退按钮神奇地解决的东西必须在iOS中完全被黑客入侵。 – dorbsz 2014-09-19 22:07:14

+0

好的,根据我的理解,您在Main.storyboard上定义了一些动态故事板,并且您将它们从singleViewControllerSB和tabbarControllerSB中动态加载。就我而言,我不想在MainStoryBoard上定义我将链接到不同的故事板,我所需要做的就是以编程方式从不同的故事板启动视图控制器,并能够返回到视图控制器在我完成它之后调用它,这是不可能的? – dorbsz 2014-09-19 22:26:50

+0

不,我正在创建一个动态视图控制器,传递我想要在运行时属性中导航到的故事板的名称。是的,这可能与我的示例一样。 – MDB983 2014-09-19 22:44:36

0
UIViewController * YourViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"Storyboard Identifier"]; 
[self.navigationController pushViewController:YourViewController animated:TRUE]; 
相关问题