Iphone 防止重设viewcontroller-UINavcontroller+情节提要+Segue

Iphone 防止重设viewcontroller-UINavcontroller+情节提要+Segue,iphone,objective-c,uiviewcontroller,storyboard,segue,Iphone,Objective C,Uiviewcontroller,Storyboard,Segue,我需要一些帮助来为以下“问题”选择“正确”的解决方案 我使用新的故事板功能将应用程序的所有屏幕链接在一起。基本上,结构可细化为: [导航控制器]=>[视图控制器1]=>[选项卡控制器]=>[视图控制器2]* **以及其他一些目前并不重要的标签* 我已将一个segue push从第一个视图控制器1连接到选项卡栏控制器后面的视图控制器。当用户按下第一个控制器上的某个按钮并正常工作时,会触发此推送 // Execute preset segue [self performSegueWithIdenti

我需要一些帮助来为以下“问题”选择“正确”的解决方案

我使用新的故事板功能将应用程序的所有屏幕链接在一起。基本上,结构可细化为:

[导航控制器]=>[视图控制器1]=>[选项卡控制器]=>[视图控制器2]*

**以及其他一些目前并不重要的标签*

我已将一个segue push从第一个视图控制器1连接到选项卡栏控制器后面的视图控制器。当用户按下第一个控制器上的某个按钮并正常工作时,会触发此推送

// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];
当现在在视图控制器2中的用户按下导航栏中的后退按钮时,用户返回。假设他现在再次触发segue,第二个视图控制器再次显示,但现在“重置”为空。我相信在阅读了一些论坛和文章后,这是使用segue时的标准行为,因为它们每次都会破坏并重新初始化视图控制器

重置视图控制器会带来问题,因为第二个视图控制器的内容是动态的,取决于服务器的JSON响应,因此“需要”视图控制器保持完整或在用户返回时恢复

我已经找到了几个描述同一问题的来源,但解决方案各不相同,我需要一些帮助来选择正确的解决方案

总结:

当用户按下返回键时,我如何“保留”/保存视图控制器的状态,同时保留情节提要的使用&最好也是Segue的 自己的想法:

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

2我想到的另一个方法是“绕过”segue并手动处理视图切换,部分解释见-这也可能吗

但也许有一个更简单/更好的选择


对于将来遇到我的问题的任何人,这就是我如何“编码”它的结果

打开情节提要并选择“选项卡栏控制器”,然后打开属性检查器

在字段中填写“标识符”

对于第一个视图控制器,请参见原始帖子中的场景,我创建了对视图控制器的全局引用:

firstviewcontroller.h

firstviewcontroller.m

现在,要从firstviewcontroller切换,可以使用以下行:

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

是的!!我找到了解决办法。请执行以下操作:

在your.h文件中:

在your.m文件中:

所选索引是要转到的选项卡

tabController.selectedIndex = 1;

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

在不使用属性的情况下,这可能是更简单的解决方案-事实上,您的所有类实例都不需要知道它们的目标控制器,因此只需在push函数中将其保存为static:

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];
p、 s.DLog只是NSLog的变体


但是如何使用segue?

执行此操作非常有趣。在部署选项卡栏界面时,必须将此视图安装为窗口的根。与其他视图控制器不同,选项卡栏界面不应作为其他视图控制器的子级安装。不相关,但很重要。我不知道!这与我的问题有关,因为我确实在tabcontroller前面有另一个viewcontroller。但这根本不使用Segues-您正在退回到编程风格。我很想看看你怎么还能使用segues。哇。。。你几乎引用了@Robert Jan的答案,却不能给他任何信任。除了使用他的答案,你唯一做错的事情就是设置一个iVar而不是属性设置器/getter。Wilhelmsen,在做出这样的声明之前检查帖子的日期。我在4个月前发布了上面的代码。2011年12月2日vs 2012年3月10日。
@property (strong, nonatomic) UITabBarController *tabController;
@synthesize tabController;

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

[[self navigationController] pushViewController:tabController animated:YES];
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];