在ViewControllers之间共享变量

时间:2014-07-31 09:16:37

标签: ios objective-c viewcontroller

我有一个包含三个页面的iPhone应用程序,每个页面都允许用户输入一些文本。在最后一页上,我想连接所有三个字符串并将其打印出来。我为每个页面都有一个UIViewController(名为PageXController),我正在尝试将变量传递到最后一页。我目前尝试的方法并不是很有效。这是一个例子:

我首先在PageThreeController.h

中将字符串声明为实例变量
@interface PageThreeController : UIViewController{
    NSMutableString *string;
}

@property (nonatomic) NSMutableString *string;

接下来,我将以下内容添加到PageOneController.h

#import "PageThreeController.h"

@interface PageOneController : UIViewController

@property (nonatomic) PageThreeController *pageThree; 

PageOneController中,然后我尝试在第3页设置字符串实例变量;

- (IBAction)handleButton:(id)sender {
    _pageThree = [[PageThreeController alloc] init];
    _pageThree.from = [[NSMutableString alloc]init];
    [_pageThree.from appendString:@"Hello World"];
        NSLog(@"My string is %@ on page one.", _pageThree.from);
}

第一页上的NSLog打印出我的字符串为'Hello World'。但是当我在连接之前在PageThreeController.m上添加相同的NSLog时,'string'NULL

似乎我正在制作pageThreeViewController的单独副本。在第3页上我需要做些什么来更改字符串的实际值?我真的很擅长这个

3 个答案:

答案 0 :(得分:0)

自定义prepareForSegue方法,以便通过这些控制器的公共属性传递必要的变量。 例如:

#pragma mark - PreparaForSegue
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
   if ([segue.identifier isEqualToString:@"goToDetail"]) {
           YourDestinationController *destinationController = segue.destinationViewController;
            destinationController.myString = self.myStringToPass;
    }
}

其中myString是YourDestinationController中的公共属性,myStringToPass是源控制器中的属性(它可能位于私有范围内)

答案 1 :(得分:0)

如果您需要从任何地方访问它,您可以将变量存储在AppDelegate中。所以如果你的AppDelegate中有这样的变量:

@property (nonatomic) NSString *currentStringToPass;

然后,您可以使用以下代码从ViewControllers访问它:

- (IBAction)handleButton:(id)sender {
    AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    _pageThree = [[PageThreeController alloc] init];
    _pageThree.from = [[NSMutableString alloc]init];
    [app setCurrentStringToPass:@"Hello World"];
        NSLog(@"My string is %@ on page one.", [app currentStringToPass]);
}

答案 2 :(得分:0)

在ViewControllers之间传递数据的最简单方法是使用AppDelegate,尽管如此 还有其他方法。

方法1 - 使用AppDelegate。 在Appdelegate中添加以下行。

@property (strong,nonatomic) NSMutableString *str;

要从任何视图控制器访问变量,

 MyAppdeleagte appDelegate=[[UIApplication sharedApplication]delegate]; 

 NSMutableString *Stringdata=appDelegate.str;

方法2 - 指定对象。 在这种方法中,您可以像现在一样继续进行,只需要指定 查看控制器实例。

让你从一个控制器导航到另一个控制器,比如FirstController到Second。 Firstcontroller.h

@interface FirstController : UIViewController{
    NSMutableString *string;
}

@property (nonatomic) NSMutableString *string;

SecondController.h

@interface SecondController : UIViewController{

}

@property (strong,nonatomic) FirstController *firstScreen;

在FirstController的实现中,在导航到SecondController之前,必须在SecondController中指定实例。

在FirstController.m中

SecondController *nextScreen=[self.storyboard instantiateViewControllerWithIdentifier:@"SecondView"];

nextScreen.firstScreen=self;

然后在SecondController.m中,您可以简单地将String作为

_firstScreen.string;