视图每次打开时都会重置所有变量吗?

时间:2012-11-11 00:22:27

标签: objective-c

每次视图重新打开/离开时,我都会重置一个int。我已经尝试了各种方式来声明我能想到的int,从公共,实例变量到全局变量,但它似乎仍然重置!

@interface MainGameDisplay : UIViewController
extern int theDay;

@implementation MainGameDisplay

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%i", theDay);
}

- (IBAction)returnToHome:(id)sender {
        ViewController *new = [[ViewController alloc] initWithNibName:nil bundle:nil];
        [self presentViewController: new animated:YES completion:NULL];
        NSLog(@"%i", theDay);
}

- (IBAction)theDayAdder:(id)sender {
    theDay++;
}

好的,所以theDay是一个全局整数变量。在View上加载NSLog返回0的输出。然后我可以根据需要多次点击DayAdder,当我点击returnToHome时,它会告诉我当天是什么。当我回到MainGameDisplay页面时,即使它是一个全局变量,theDay也会重置为零?

Output:
0
N (number of times you clicked 'theDayAdder' button)
0

3 个答案:

答案 0 :(得分:1)

问题是你每次回到它时都会分配初始化MainGameDisplay的新实例,所以你的全局变量当然会重置为0.你需要在ViewController中创建一个属性(类型为strong),每次都用它来回到同一个实例。

- (IBAction)returnToGameDisplay:(id)sender {
     if (! self.mgd) {
        self.mgd = [[MainGameDisplay alloc] initWithNibName:nil bundle:nil];
     }
     [self presentViewController: self.mgd animated:YES completion:NULL];
     NSLog(@"%i", theDay);
}

在此示例中,mgd是在.h文件中创建的属性名称。

答案 1 :(得分:0)

您应该知道在加载视图时调用viewDidLoad() - 而不是在您按照说法“打开”视图时调用。您可能会以保留值打开一个视图并一次又一次地重新打开,并且只调用一次vieDidLoad()。但是,只要视图变得可见,viewWillAppear()就是被调用的委托。因此,尝试在viewWillAppear()中输出您的值 - 而不是viewDidLoad()并适当地调用视图(即,让它粘在一起,而不是每次需要时都创建)。这将使视图在调用之间不被破坏。您的视图代码应如下所示:

@interface MainGameDisplay : UIViewController
extern int theDay;

@implementation MainGameDisplay

- (void)viewDidLoad {
    [super viewDidLoad];
}

-(void) viewWillAppear:(BOOL) animated {
    [super viewWillAppear:animated];
    NSLog(@"%i", theDay);
}

- (IBAction)returnToHome:(id)sender {
        ViewController *new = [[ViewController alloc] initWithNibName:nil bundle:nil];
        [self presentViewController: new animated:YES completion:NULL];
        NSLog(@"%i", theDay);
}

- (IBAction)theDayAdder:(id)sender {
    theDay++;
}

视图的父级(我假设appDelegate)应该执行以下操作

@property (nonatomic, strong) MainGameDisplay *mainGameDisplay = [[MainGameDisplay alloc] initWithNib:@"MainGameDisplay" …]

ViewDidLoad()被调用一次 - 在创建和加载视图之后。但是,适当调用viewWillAppear()和IBAction等触发的其他函数。

答案 2 :(得分:0)

extern个变量意味着不变。如果你期望你的MainGameDisplay类是长寿的,或者theDay只是被认为与该类有关,为什么不将theDay声明为属性,或者,如果你只需要在MainGameDisplay内部设置它,作为一个ivar。

另一种选择,如果您希望该值继续独立于声明它的类实例而存在,则将其声明为static。静态var将保留其值,即使在声明它的类的不同实例的生命周期中也是如此。