0

ビューが再び開く/離れるたびに自動的にリセットされる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はグローバル整数変数です。ビューの読み込み時にNSLogは0の出力を返します。その後、DayAdderを何度でもクリックできます。また、returnToHomeをクリックすると、theDayが何であるかがわかります。ただし、MainGameDisplayページに戻ると、グローバル変数であっても、Dayはゼロにリセットされますか?

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

3 に答える 3

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ファイルで作成されたプロパティ名です。

于 2012-11-11T00:50:10.373 に答える
0

viewDidLoad()は、ビューがロードされたときに呼び出されることを知っておく必要があります。あなたが言うように、ビューが「開いた」ときではありません。ビューが保持された値で開かれ、何度も再度開かれ、vieDidLoad()が1回だけ呼び出される場合があります。ただし、ビューが表示されるようになると、viewWillAppear()が呼び出されるデリゲートになります。したがって、viewDidLoad()の代わりにviewWillAppear()に値を出力してみて、ビューを適切に呼び出します(つまり、必要なときに毎回作成されるのではなく、ビューを固定します)。これにより、呼び出しの間にビューが破壊されるのを防ぐことができます。ビューのコードは次のようになります。

@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()は、ビューが作成されてロードされた後に1回呼び出されます。ただし、viewWillAppear()およびIBActionなどによってトリガーされるその他の関数は適切に呼び出されます。

于 2012-11-11T01:01:03.887 に答える
0

extern変数は定数であることが意図されています。MainGameDisplayクラスの存続期間が長いと予想される場合、またはtheDayそのクラスにのみ関連付けられることになっている場合は、theDayをプロパティとして宣言するか、MainGameDisplayの内部でivarとして設定するだけでよい場合はどうでしょうか。 。

もう1つの方法は、その値が宣言されているクラスインスタンスとは独立して存在し続けるようにする場合、それを宣言することstaticです。静的変数は、宣言されたクラスのさまざまなインスタンスの存続期間中であっても、その値を保持します。

于 2012-11-11T01:18:36.397 に答える