0

私はクラスA、クラスB、クラスCの3つのクラスを持っています。

ClassB から ClassA に変数を渡し、次に ClassB(View Controller) をポップしています

//ClassB.m

    ClassA *obj = [[ClassA alloc]init];
    [obj passValue:value];
    [obj release];

[self.navigationController popViewControllerAnimated:YES]; //It will pop and show ClassC View Controller.

//ClassA.h

NSString* storeValue;
-(void)passValue:(NSString*)getValue;

//ClassA.m

-(void)passValue:(NSString*)getValue
{
   NSLog(@"Value is %@",getValue); // I am Getting Value Here
   storeValue = getValue; 
}

ClassCで。ClassA View Controllerをプッシュしています

ClassC.m

ClassA *objA = [[ClassA alloc]init];
[self.navigationController pushViewController:objA animated:YES];
[objA release];

現在はクラス A です。Didload の内部ビュー。storeValue を印刷しようとしました。しかし、それはnullを返します。ここで私が間違っていること。サンプルコードを使用して正しい方法でガイドしてもらえますか。

プロパティを使用して変数にアクセスしようとしました。しかし、それはnull値を返します。

ありがとう、アニッシュ

4

5 に答える 5

2

クラスの階層に従うことを検討しました-C-> A-> BクラスAはすでにナビゲーションスタックにあるため、クラスAのオブジェクトを作成する必要はありません。使用する -

NSMutableArray *activeControllerArray = [self.navigationController.viewControllers mutableCopy];
for(int i = 0, i <[activeControllerArray  count], i++) {
    if([[activeControllerArray objectAtIndex:i] isKindOfClass:[ClassA class]) {
        //Set Property and instance variable here
        ClassA *obj = [activeControllerArray objectAtIndex:i];
        obj.someVariable = somevalue; //you can use in any way that you want

        break;
     }
}
//Pop to previous view now
于 2012-05-09T08:58:32.533 に答える
1

実際には ClassA の複数のインスタンスを参照しています。ClassB では、新しい ClassA のオブジェクトを作成し、値を設定します。

classC では、ClassA の別のインスタンスを作成し、前のインスタンスに設定された値を確認しています。

static と宣言されている場合、すべてのインスタンスで「storeValue」に設定された値にアクセスできます。

Else インスタンス変数は、クラスのインスタンスに属し、インスタンスごとに個別に管理されます。


今回は完全に間違っていると思います。

  1. デリゲート メソッドを実装して、ポップする前にオブジェクトを戻してから使用することができます。
  2. 静的変数を使用すると、そのクラスのすべてのインスタンスで共通になります。これは望ましくない場合があります。
  3. または、NSNotification を投稿することもできます。そして、オブジェクトを一緒に渡します。これらの通知のリスナーは、それをキャッチして別の方法で処理できます。
于 2012-05-09T08:57:33.240 に答える
0

viewDidLoadに値を出力しないでください

viewDidLoadは、割り当て後、変数を渡す前に発生します。そのため、変数はNULLを返します。

本当にこの方法で渡す必要がある場合は、ヘッダーに変数を設定してから、passingメソッドを使用します

例えば ​​:

文字列myStringをAからBに渡してから、Bに移動して文字列を出力します。

Aで、Bをインポートしてから、次の機能を実行します

self.bViewController = [[BVIEWCONTROLLER alloc]init];

[self.bViewController setmyString:myString];

//if u're running OS lower than 5.0, include this
[self.bViewController viewDidAppear];

その後、viewDidAppearメソッド内のbビューコントローラでmyString変数を出力します。

幸運を

于 2012-05-09T09:44:25.290 に答える
0

@JS Rodriguesが言ったように、ClassAの既存のインスタンスを指しているのではなく、ClassAの別のインスタンスを作成しているだけです。

ClassAの既存のインスタンスを取得するには、ナビゲーションコントローラーのスタックを制御できます(このコードは@rishiコードに似ていますが、高速列挙を使用します)。

for (UIViewController *obj in self.navigationController.viewControllers) {
    if ([obj isKindOfClass:[ClassA class]]) {
        ClassA *ca=(ClassA *)obj;
        [ca passValue:value];
    }
}
于 2012-05-09T09:11:46.913 に答える
0

クラス C にポップするときにクラスを変更します。

ClassC *obj = [[ClassC alloc]init];
[obj passValue:value];
[self.navigationController popViewControllerAnimated:YES]; 
[obj release];
于 2012-05-09T08:49:10.913 に答える