0

私はそれを理解していません..これはあちこちで起こりますが、ライムや理由を見つけることができません。私はしばらくの間SOを検索しましたが、運がありませんでした。多分あなたたちは私が間違っていることを教えてくれますか?

ViewController_BからViewController_AにBOOLを設定しています。コードをステップスルーすると、BOOLがYESに変更されますが、VC_Aに返送されると、NOに戻ります。

更新:これはすべてメインスレッドにあります。

これが私のコードです。

ViewController_A.h

BOOL shouldLogin;

@property(nonatomic,assign)BOOL shouldLogin;

ViewController_A.m

@synthesize shouldLogin;


//in viewWillAppear of ViewController_A
if (shouldLogin == YES) {
//do something - im trying to get in here but I cant because the BOOL is NO when I come back to this view

}

これがViewController_BでBOOLを設定する方法です

    ViewController_A * vc = [[ViewController_A alloc]init];
    vc.shouldLogin = YES; 
   //stepping through the code and looking at the value, shouldLogin shows YES 
    [self dismissModalViewControllerAnimated:YES]; // this drops down VC_B which will show VC_A

//now VC_A just came into view and the BOOL is now NO which makes the compiler skip over my IF statement

更新:私が持っていたリリース呼び出しを削除しましたが、それでも同じ問題です。

4

3 に答える 3

2

のコードがViewController_B完全に新しいを作成しViewController_A、フラグを設定し、shouldLoginすぐにそのインスタンス化を破棄しているようですViewController_A。私はこれがあなたがやろうとしていることではないかと思います。

shouldLogin以前にインスタンス化されたにフラグを設定したいとしますViewController_AViewController_Aにポインタを渡してから、ViewController_Bこのポインタを使用してにフラグを設定する必要がありますViewController_B。これは、へのポインタを受け取り、で使用するために格納するカスタムinitメソッドを使用して行うことができます。ViewController_BViewController_AViewController_B

ViewController_Bまたは、の作成後にこのプロパティへのポインタを格納してこのプロパティを設定できるViewController_AプロパティViewController_Aを作成することもできますViewController_B。何かのようなもの:

@interface ViewController_B : UIViewController

@property (nonatomic,retain) ViewController_A *originalViewController;

@end

@implementation ViewController_B

@synthesize originalViewController;

- (void)someMethod {
    originalViewController.shouldLogin = YES; 
    [self dismissModalViewControllerAnimated:YES];
}

@end

@implementation ViewController_A 

-(void)someOtherMethod {
     ViewController_B *vcB = [[ViewControllerB alloc] init];
     vcB.originalViewController = self;

     // do something with vcB
}

@end

タイプミス/エラーを許してください、私は実際にこれを実行しようとしませんでした。

于 2012-05-25T02:01:37.547 に答える
1

ビューコントローラBをプッシュする前に、ビューコントローラAが存在していたと思います。その場合、新しいビューコントローラを作成するだけでなく、元のビューコントローラを参照する必要があります。このコードのどこにも元のViewControllerに触れていないので、変更されないことは完全に理にかなっています。

于 2012-05-25T02:01:46.613 に答える
1

ViewController_Aはクラスであり、オブジェクトではありません。shouldLoginには、ViewController_Aクラスのオブジェクトからのみアクセスできます。

前に示したViewController_Aのオブジェクト(またはインスタンス)は、ViewController_Bコードのインスタンスと同じではありません。表示するコードは、まったく新しいViewController_Aオブジェクトを作成し、そのオブジェクトでブール値をYESに設定してから、すぐにそのオブジェクトを破棄します。ViewController_Bインスタンスを表示する前に、ViewController_Aインスタンス内で何も変更されなかったため、元のViewController_Aを表示するために戻ったときは、そのままで、shouldLoginをNOに設定して完了しました。

shouldLoginは、複数のView Controllerがアクセスする必要がある変数のように見えるので、完全に別のクラスに設定します(両方のView Controllerがアクセスできます)。このような変数の場合、私はシングルトンクラスを作成し、必要な領域の周りでそのオブジェクトへのアクセスを共有する傾向があります。もちろん、これを行う方法は他にもありますが、最も簡単だと思います。

于 2012-05-25T02:10:45.883 に答える