从Storyboard获取ViewController

时间:2014-03-04 16:51:31

标签: ios objective-c nsstring uistoryboard

我有两个ViewControllers,它们没有(直接)与Segue连接。但我想在第二个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)到菜单。 so:menu-> firstVC->菜单。菜单 - > secondVC-> ...->菜单

我尝试使用StoryboardID:

    -(void)viewDidDisappear:(BOOL)animated{
        [super viewDidDisappear:animated];

        secondViewController* svc =[[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"secondVCSrorybradID"];

        svc.anotherString = self.originalString;    
    }

3 个答案:

答案 0 :(得分:11)

您可以使用此代码将字符串传递给第二个视图控制器。

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。

希望这会对你有所帮助。

答案 1 :(得分:2)

您应该通过UIViewController导航连续传递数据。例如,如果您有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中,您可以使用NSString

  • 更改菜单中的_menu.importantString = @"";

答案 2 :(得分:1)

永远不要使用new来创建视图控制器。

如果您正在使用故事板但不使用segues,您仍然可以从故事板创建视图控制器并调用它。

使用方法instantiateViewControllerWithIdentifier:创建目标视图控制器的实例。设置要设置的属性,最后调用以显示它(以模态方式呈现,将其推送到导航堆栈,或适合您的程序的任何内容。)