从故事板获取视图控制器

4

我有两个ViewControllers,它们没有(直接)通过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。从firstVC可以返回到menu(使用navigationbackbarbutton)。所以:menu->firstVC->menu。menu->secondVC->...->menu
我的尝试使用StoryboardID:
    -(void)viewDidDisappear:(BOOL)animated{
        [super viewDidDisappear:animated];

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

        svc.anotherString = self.originalString;    
    }

你如何从第一个 VC 到达第二个 VC? - rdurand
为什么你不能使用故事板 ID? - Ilario
当您更改svc.anotherString时,您是否在问为什么originalString没有更新? - iain
是的,那是我的问题iani。 - Sam
1
不要使用 [UIStoryboard storyboardWithName:]。由于这是在视图控制器中,您可以使用视图控制器的故事板属性:[self.storyboard instantiateViewControllerWithIdentifier: @"secondVCSrorybradID"]。而且,你的故事板 ID 确实是 secondVCSrorybradID 吗?一个 ID 中有两个拼写错误?它必须完全匹配,逐字逐句,并具有正确的大小写,否则将无法加载视图控制器。 - Duncan C
3个回答

11

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

secondViewController* svc =[self.storyboard instantiateViewControllerWithIdentifier:@"Your Second VC's Storyboad ID"];
svc.anotherString = self.originalString;    
[self presentViewController:svc animated:YES completion:nil];

//你需要在第二个视图控制器的.h文件中创建另一个字符串属性。

现在你可以将originalString的字符串传递到第二个视图控制器。现在你可以将这个值从第二个视图控制器传回第一个视图控制器。

希望这能帮助到你。


2

您需要通过 UIViewController 的导航顺序传递数据。例如,如果您有一个导航结构如下:FirstVC > SecondVC > ThirdVC

在您的 FirstVC.m 中,使用:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    ((SecondVCClass*) segue.destinationViewController).secondVCString = _firstVCString;
}

在您的第二个视图控制器中,secondVCString 是一个属性。在 SecondVC.m 文件中,使用以下代码:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    ((ThirdVCClass*) segue.destinationViewController).thirdVCString = _secondVCString;
}

当然,thirdVCString 是您第三个视图控制器中的一个 @property
编辑: 由于您更新了问题,这是我的建议:
  • In your MenuVC, add this :

    @property (nonatomic, weak) NSString *importantString;
    
  • In your FirstVC and SecondVC, add this :

    @property (nonatomic, weak) MenuVCClass *menu;
    
  • When you push to FirstVC or SecondVC, use prepareForSegue to set the destination's view controller menu property to your 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;
    }
    
  • In FirstVC or SecondVC, you can change the NSString value from your menu using _menu.importantString = @"";


谢谢,但我的第一个和第二个VC都来自另一个VC,所以当我回到我的菜单时,"prepareForSegue"方法不会被调用。 - Sam
你能否编辑你的问题并提供你的应用程序结构?例如:FirstVC -- SecondVC -- 等等。 - rdurand
是的,它可以工作!!谢谢 :D 虽然不完全像您所说的,但是这是您使用menuVC的主要想法,非常感谢!! §> U - Sam

1

不应使用new来创建视图控制器。

如果你正在使用故事板但并未使用segue,仍可以从故事板中创建视图控制器并调用它。

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


不能使用故事板ID,是什么意思?为什么?你说“因为我使用Xcode 5”,这没有任何意义。 - Duncan C
但我没有任何故事板ID,真的... 我只有标题。 - Sam
好的,但是您可以(并且应该)为您的故事板中的任何场景分配一个Storyboard ID。这在Xcode 4.0到当前版本5.0.2都得到了支持。 - Duncan C
1
伙计,如果你真的想要帮助,你需要写出其他人能够理解的句子。“它不会被保存”不是那种句子。 - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接