【问题标题】:Get ViewController from Storyboard从 Storyboard 中获取 ViewController
【发布时间】: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中有两个拼写错误?它必须完全匹配,一个字母一个字母,并且大小写正确,否则将无法加载视图控制器。

标签: ios objective-c nsstring uistoryboard


【解决方案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 都支持此功能
    • 哥们,如果你真的需要帮助,你需要写出别人能理解的句子。 “它不会被保存”不是这些句子之一。
    猜你喜欢
    • 2013-05-06
    • 2022-10-31
    • 2012-04-13
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 2018-10-11
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多