从 Storyboard 中获取 ViewController
Posted
技术标签:
【中文标题】从 Storyboard 中获取 ViewController【英文标题】:Get ViewController from Storyboard 【发布时间】:2014-03-04 16:51:31 【问题描述】:我有两个 ViewController,它们不(直接)与 Segue 连接。但我想在第二个 VC 中更改一个字符串,这是我在第一个 VC 中得到的。我的尝试是:
#import "secondViewController.h"
@interface firstViewController ()
@property NSString* originalString;
@end
@implementation firstViewController
-(void)viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
secondViewController* svc = [secondViewController new];
svc.anotherString = self.originalString;
但它不起作用,因为我只创建了第二个 VC 的实例,所以没有保存值。我也不能使用 Storyboard ID,因为我使用的是 Xcode 5。
我有一个 menuVC,您可以从中访问 firstVC 和 secondVC。从第一个VC 我可以(使用navigationbackbarbutton)返回菜单。所以:菜单->firstVC->菜单。菜单->secondVC->...->菜单
我对 StoryboardID 的尝试:
-(void)viewDidDisappear:(BOOL)animated
[super viewDidDisappear:animated];
secondViewController* svc =[[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"secondVCSrorybradID"];
svc.anotherString = self.originalString;
【问题讨论】:
如何从第一个 VC 到第二个 VC? ?为什么你不能使用情节提要 id ??? 你问为什么更改 svc.anotherString 时 originalString 没有更新? 是的,这是我的问题 iani 不要使用[UIStoryboard storyboardWithName:]
。由于这是在视图控制器中,您可以使用视图控制器的故事板属性:[self.storyboard instantiateViewControllerWithIdentifier: @"secondVCSrorybradID"]
。你的故事板ID真的是secondVCSrorybradID
吗?一个ID中有两个拼写错误?它必须完全匹配,一个字母一个字母,并且大小写正确,否则将无法加载视图控制器。
【参考方案1】:
您可以使用此代码将字符串传递给第二个视图控制器。
secondViewController* svc =[self.storyboard instantiateViewControllerWithIdentifier:@"Your Second VC's Storyboad ID"];
svc.anotherString = self.originalString;
[self presentViewController:svc animated:YES completion:nil];
//你必须在第二个 View Controller 的 .h 文件中创建 anotherString 属性。
现在您可以将 originalString 的字符串传递给第二个 VC。现在您可以将此值从第二个 VC 取回给第一个 VC。
希望这对你有帮助。
【讨论】:
【参考方案2】:您应该通过UIViewController
s 导航连续传递您的数据。例如,如果您有类似 FirstVC > SecondVC > ThirdVC
的导航:
在您的 FirstVC.m 中,使用:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
((SecondVCClass*) segue.destinationViewController).secondVCString = _firstVCString;
secondVCString
在您的第二个 ViewController 中成为 @property
。
在您的 SecondVC.m 中,使用:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
((ThirdVCClass*) segue.destinationViewController).thirdVCString = _secondVCString;
当然,thirdVCString
在您的第三个 ViewController 中是 @property
。
编辑:
当你更新你的问题时,这是我的建议:
在您的 MenuVC 中,添加以下内容:
@property (nonatomic, weak) NSString *importantString;
在您的 FirstVC 和 SecondVC 中,添加以下内容:
@property (nonatomic, weak) MenuVCClass *menu;
当您推送到 FirstVC 或 SecondVC 时,使用 prepareForSegue
将目标的视图控制器 menu
属性设置为您的菜单:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"FirstSegue"])
((FirstVC*) segue.destinationViewController).menu = self;
else if ([segue.identifier isEqualToString:@"SecondSegue"])
((SecondVC*) segue.destinationViewController).menu = self;
在 FirstVC 或 SecondVC 中,您可以使用 _menu.importantString = @"";
从菜单中更改 NSString
值
【讨论】:
谢谢,但是我在 VC 上的第一个和第二个都来自另一个 VC,所以当我回到我的菜单时,不会调用方法“prepareForSegue”。 你能用你的应用结构编辑你的问题吗?像 FirstVC -- SecondVC -- 等等。 是的,它有效!谢谢 :D 不完全像你,但这是你对 menuVC 的主要想法,非常感谢! §> U【参考方案3】:您永远不应该使用new
创建视图控制器。
如果您使用情节提要但不使用转场,您仍然可以从情节提要创建视图控制器并调用它。
使用方法instantiateViewControllerWithIdentifier:
创建目标视图控制器的实例。设置您要设置的属性,最后调用显示它(以模态方式呈现,将其推送到导航堆栈,或任何适合您的程序的东西。)
【讨论】:
您的意思是不能使用情节提要 ID?为什么?您说“因为我使用 Xcode 5”,这没有任何意义。 但我没有任何故事板 ID,真的……我只有标题 好的,但是您可以(并且应该)为故事板中的任何场景分配故事板 ID。从 Xcode 4.0 到当前版本 5.0.2 都支持此功能 哥们,如果你真的需要帮助,你需要写出别人能理解的句子。 “它不会被保存”不是这些句子之一。以上是关于从 Storyboard 中获取 ViewController的主要内容,如果未能解决你的问题,请参考以下文章
是否可以以编程方式从 Swift/Objective-C 中的 UIViewController 或 Storyboard 中获取基本 UIViewController 的标识符?
iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?