防止viewcontroller被重置 - UINavcontroller + Storyboard + Segue的

时间:2011-11-29 22:37:36

标签: iphone objective-c uiviewcontroller storyboard segue

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

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

[导航控制器] => [查看控制器#1] => [Tabbar Controller] => [查看控制器#2] *

**(以及其他一些现在不重要的标签)*

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

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

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

这(视图控制器被重置)会产生问题,因为第二个视图控制器的内容是动态的(取决于来自服务器的JSON响应),因此“需要”视图控制器保持不变(或者是当用户回来时。恢复。

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

概述:

  • 当用户按下时,如何“保留”/保存View Controller的状态,同时保留使用Storyboard&最好也是Segue的

自己的想法:

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

#2 我想到的另一个是“绕过”segue并手动处理视图切换,部分解释为(Storyboard - refer to ViewController in AppDelegate) - 这也可能吗?< / p>

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

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?

3 个答案:

答案 0 :(得分:2)

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

在你的.h文件中

@property (strong, nonatomic) UITabBarController *tabController;

在你的.m文件中:

@synthesize tabController;

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

所选索引是您要去的标签

tabController.selectedIndex = 1;

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

答案 1 :(得分: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];

答案 2 :(得分: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];

<强> P.S。 DLog只是NSLog的变体。

但是如何用segue做这个真的很有趣?