在ViewControllers之间共享数据

时间:2012-06-14 19:23:43

标签: ios viewcontroller

我有一个简单的单视图iOS 5应用程序,我添加了第二个视图控制器。我在导航控制器中嵌入了这些,我在FirstViewController上放了两个按钮。这些按钮中的每一个都有一个segue的命名标识符,后者又在iPhone应用程序的UI中显示我的SecondViewController。

所有工作都按预期工作,但是,我想在第二个视图控制器上的标签中显示一些简单的内容,例如,您点击了按钮1'。我已经尝试将这些数据手动放在我在AppDelegate中声明的NSMutableString变量中,我可以在第二个视图控制器中访问该变量但是我分配给它的值永远不会显示在屏幕上。

显然,创建了一个SecondViewController的新实例,这可能就是我没有看到它的原因。我创建了一个名为UILabel的IBOutlet,其名称为myLabel,用于保存此值,但是我看到没有变化。

非常感谢任何帮助。

注意:我很乐意发布代码,但我认为这不会对我的问题有所帮助。

4 个答案:

答案 0 :(得分:2)

我在这种情况下的解决方案始终是自定义-init方法。如,

-initWithButtonPressedString:(NSString*)message;

在第二个视图控制器中声明并调用:

self.secondView = [[SecondViewController alloc]initWithButtonPressedString:@"some conditional string"];

然后,所需的只是第二个视图控制器中的iVar来处理传递的字符串。

答案 1 :(得分:1)

要在视图控制器之间传递数据,您应该考虑 1.为您的视图控制器创建一个自定义初始化,传递其他信息或 2.在第二个视图控制器上创建属性,您可以从第一个视图控制器访问该属性。

您可以为您创建的IBOutlet创建属性,但是如果从第一个视图控制器访问它,则需要确保它在加载视图之后。

如果没有看到您当前的代码,很难给您更多指导

答案 2 :(得分:0)

你使用故事板吗? 无论如何,您是否已将IBOutlet连接到Interface Builder中的变量?

如果您使用Storyboard,您可能会尝试使用调用的方法 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"ChooseToDetailsSegue"]) {
        preparedSegue = segue;
        SaleDetailsViewController *saleDetailsVC = [preparedSegue destinationViewController];
        saleDetailsVC.saleDetailsProduct = [elementsArray objectAtIndex:selectedRow];
        saleDetailsVC.cardTransactionDetails = [[cardDetails alloc] init];
        saleDetailsVC.cardTransactionDetails.number = infoCardNumber;
        saleDetailsVC.cardTransactionDetails.month = infoExpiriationM;
        saleDetailsVC.cardTransactionDetails.year = infoExpiriationY;     
    }
}

您只需要初始化新的ViewController(您的目标)并引用它们的变量。

答案 3 :(得分:0)

您还可以使用通知。在FirstViewController的第一个按钮的IBAction中,您可以添加

NSNotification *messageFromFirstViewController = [NSNotification notificationWithName:@"firstbuttonMessage" object:@"You clicked Button 1"]; [[NSNotificationCenter defaultCenter] postNotification:messageFromFirstViewController];

和你的第二个按钮的IBAction类似。

在SecondViewController的viewDidLoad中,您可以添加

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(useNotification:) name:@"firstButtonMessage" object:nil];

创建useNotification方法以更改myLabel:

-(void) useNotification:(NSNotification *)notification {
self.myLabel.text = notification.object;}
相关问题