每次视图重新打开/离开时,我都会重置一个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
答案 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将保留其值,即使在声明它的类的不同实例的生命周期中也是如此。