2011-11-29 106 views
2

我需要一些帮助为以下'问题'选择'正确'的解决方案。防止视图控制器被重置 - UINavcontroller + Storyboard + Segue的

我使用新的故事板功能将我的应用程序的所有屏幕链接在一起。基本结构能够深入:

[导航控制器] => [视图控制器#1] => [的TabBar控制器] => [视图控制器#2] *

**(和一些其他标签,其现在不重要)*

我已经从第一个视图控制器(#1)附加了一个segue(推)到Tab Bar控制器后面的View Controller。当用户按下第一个控制器上的某些东西并正常工作时,会触发此推送。

// Execute preset segue 
[self performSegueWithIdentifier:@"segueEventDetail" sender:self]; 

当用户(现在是在视图控制器#2)按压导航栏的返回按钮用户回到。假设他现在再次触发segue,第二个视图控制器再次显示,但现在“重置”(空)。 (我相信在阅读了几个论坛和文章之后,这是使用segue时的标准行为,因为这些会破坏并重新启动视图控制器的每一次?)

由于第二个视图的内容(视图控制器被重置)控制器是动态的(取决于来自服务器的JSON响应),因此当用户回来时视图控制器保持完整(或恢复)是'需要的'。

我发现了几个来源(见底部)描述相同的问题,但解决方案各不相同,我需要一些帮助选择正确的问题。

综述:

  • 我怎样才能“保留” /保存视图控制器的状态下,当用户按下背部,同时保留使用故事板&最好也Segue公司的

自己的想法的:

#1我现在正在考虑将JSON响应缓存到我的单例类(并从那里到PLIST)并在第二个查看控制器是否存在此数据,并重建视图,然后检查是否有新数据(恢复正常操作)。

#2我想到的另一个是'绕过'segue和手动处理视图的切换,部分解释(Storyboard - refer to ViewController in AppDelegate) - 这也有可能吗?

但也许有一个更容易/更好的选择?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-using-storyboards.html Storyboard - refer to ViewController in AppDelegate How to serialize a UIView?

+2

从[UITabBarController类参考](http://developer.apple.com/library/ios/#documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html)“部署标签栏界面时,您必须安装这个视图作为你的窗口的根目录。与其他视图控制器不同,一个标签栏界面不应该被安装为另一个视图控制器的子项。“无关紧要,但重要。 –

+0

我没有意识到这一点!这与我的问题有关,因为我在tabcontroller前面有另一个viewcontroller。 – YDL

回答

0

对于任何横跨在未来,这(我的)的问题来了,这是我结束了“编码”吧。

  • 打开故事板,并选择你的“标签栏控制器”,打开属性检查器

  • 填写在该领域

  • 的“标识符”随着第一个视图控制器(见的场景在原来的职位)我创建一个全球参考的ViewController:

firstviewcontroller.h

@interface YourViewController : UIViewController { 

    UITabBarController *tabController; 

} 

firstviewcontroller.m

//Fill the reference to the tabcontroller using the identifier 
tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"]; 

我们从以下行可使用的firstviewcontroller切换:

[[self navigationController] pushViewController:tabController animated:YES]; 
+0

尽管这根本不使用Segues,但您正在逐渐回到程序化的做事风格。我很想看看你还能如何设法使用segues。 – sparkFinder

+0

哇...你几乎引用@罗伯特 - 简的答案,并不能让他信任它。你做错的唯一事情就是设置一个iVar而不是一个属性setter/getter。 – chwi

+0

Wilhelmsen,在提出此类索赔前请检查帖子的日期。我在4个月前发布了代码。 (02-12-2011 vs 10-03-2012)。 – YDL

2

耶士!!我得到了解决方案。执行以下操作:

在你的.h文件:

@property (strong, nonatomic) UITabBarController *tabController; 

在你.m文件:

@synthesize tabController; 

tabController = [self.storyboard instantiateViewControllerWithIdentifier:@"tabbar"]; 

选定的指标是你想要的标签去

tabController.selectedIndex = 1; 

[[self navigationController] pushViewController:tabController animated:YES]; 
0

这可能是更简单的解决方案(不使用属性 - 事实上,所有的类实例并不需要知道他们的目的地控制器,所以只是将其保存为静态的推功能):

static UIVewController *destController = nil; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 
if (!storyboard) { 
    DLog(Storyboard not found); 
    return; 
} 
if (destController == nil) { //first initialisation of destController 
    destController = [storyboard instantiateViewControllerWithIdentifier:@"{Your Destination controller identifyer}"]; 
    if(!destController) { 
     DLog(destController not found) 
     return; 
    } 
} 
//set any additional destController's properties; 
[self.navigationController pushViewController:destController animated:YES]; 

附: DLog只是我的变化NSLog

但是真的很有趣如何用segue做到这一点?

相关问题