防止ViewController重置-UinavController + Storyboard + Segue
-
25-10-2019 - |
题
我需要一些帮助来为以下“问题”选择“正确”解决方案。
我使用新的故事板功能将应用程序的所有屏幕链接在一起。基本上,结构向下钻至:
导航控制器] => [视图控制器#1] => [TABBAR控制器] => [View Controller#2]*
**(还有其他一些目前不重要的选项卡)*
我已经将一个从第一个视图控制器(#1)连接到标签栏控制器后面的视图控制器。当用户按第一个控制器上的某些内容并正常工作时,将触发此推动。
// Execute preset segue
[self performSegueWithIdentifier:@"segueEventDetail" sender:self];
当用户(现在是视图控制器#2中的用户)按下Navbar中的后退按钮时,用户返回。假设他现在再次触发了segue,第二个视图控制器再次显示,但现在“重置”(空)。 (我相信在阅读了几篇论文和文章后,使用SEGUE时,这是标准行为,因为它们每次都会破坏并重新启动视图控制器吗?)
此(重置的视图控制器)提出了问题用户回来了。
我发现了一些描述相同问题的来源(请参阅底部),但是解决方案有所不同,我需要一些帮助选择正确的问题。
总结:
- 当用户向后按下时,我如何“保留”/保存视图控制器的状态,同时保留故事板的使用并最好也是SEGUE的使用
自己的想法:
#1 我现在正在考虑缓存JSON对我的Singleton类的响应(以及从那里到PLIST),并在第二视图控制器中检查是否存在此数据,而不是重建视图,然后我检查任何新数据(恢复正常恢复正常)手术)。
#2 我正在考虑的另一个是“绕过” segue并手动处理视图的转换,部分解释了(故事板 - 请参阅AppDelegate中的ViewController) - 这也可能吗?
但是,也许有一个更容易/更好的选择?
http://www.iphonedevsdk.com/forum/iphone-sdk-development/93913-retaining-data-when-when-using-storyboards.html 故事板 - 请参阅AppDelegate中的ViewController 如何序列化uiview?
解决方案 2
对于将来遇到这个问题的任何人来说,这就是我最终“编码”它的方式。
打开故事板并选择“标签栏控制器”,然后打开属性检查器
在现场填写“标识符”
使用第一个视图控制器(请参阅原始帖子中的方案),我创建了对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];
其他提示
是的!我得到了解决方案。请执行下列操作:
在您的.h文件中:
@property (strong, nonatomic) UITabBarController *tabController;
在您.m文件中:
@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];
PS DLog
只是我的变体 NSLog
.
但是如何与Segue一起做这真的很有趣?