从 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】:

您应该通过UIViewControllers 导航连续传递您的数据。例如,如果您有类似 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容器中嵌入的视图控制器的引用?

故事板连续和返回

关于 UIViewController 层次结构和流程的建议

获取Storyboard中的视图控制器

在 Storyboard 中获取子视图的帧