1

私は3つのView Controller A、B、Cを持っています.. AからCにデータを渡したいです... Cでプロパティを作成し、それをAで使用する必要があることを知っています.

しかし、理由はわかりません.. A に値を設定した後も、ビュー C に null 値が表示されます..

与えられた提案に従って、私は新しいプロジェクトと新しいコードを作成しました...私が達成したいのはビューAから簡単ですビューCで値を渡したい..しかし、現在はnullを与えています..

私のビュー1.hファイル...

@interface ViewController : UIViewController
- (IBAction)ActionButton:(id)sender;

@end

1.m ファイルを表示します。

#import "ViewController.h"
#import "ViewController3.h"
#import "ViewController2.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)ActionButton:(id)sender {
    ViewController3 *v3 = [[ViewController3 alloc]init];
    v3.string = @"String";
//    [self.view addSubview:v3.view];

    ViewController2 *v2 = [[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil ];
    [self.view addSubview:v2.view];
}
@end

2.h ファイルを表示...

@interface ViewController2 : UIViewController
- (IBAction)ActionButton:(id)sender;
@property (nonatomic,retain) NSString *string1;
@end

2.m ファイルを表示

#import "ViewController2.h"
#import "ViewController3.h"

@interface ViewController2 ()

@end

@implementation ViewController2

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)ActionButton:(id)sender {

    ViewController3 *v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil ];
    [self.view addSubview:v3.view];

}
@end

3.h ファイルを表示します。

@interface ViewController3 : UIViewController

@property(nonatomic,retain) NSString *string;

@end

3.m ファイルを表示...

#import "ViewController3.h"

@interface ViewController3 ()

@end

@implementation ViewController3

@synthesize string;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"%@",string);
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

参考までに、ビュー 1 でコメント付きのコードを削除すると、ビュー 3 で値が取得されますが、これにより、望ましくないシーケンスが変更されます...

4

4 に答える 4

3

変更された質問により問題がより明確になるため、新しい回答を作成します。

view1.m では、次のことを行います

ViewController3 *v3 = [[ViewController3 alloc]init];
v3.string = @"String";

ViewController3 の新しいインスタンスを作成し、プロパティ値を設定します。

次に、view2.mで行います

- (IBAction)ActionButton:(id)sender {
    ViewController3 *v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil ];
    [self.view addSubview:v3.view];
}

ViewController3 の別の新しいインスタンスを作成します (今回は nib レイアウトを使用) が、プロパティ値を設定しません。

あなたが行ったことは、同じオブジェクトの2つの異なるインスタンスを作成しましたが、そのうちの1つのプロパティ値のみを設定しました - あなたが表示していないものです。

ViewController2 の ActionButton メソッドで ViewController3 のプロパティ値を設定するか、ViewController3 のインスタンスを ViewController2 に渡してから、そのインスタンスからサブビューを追加する必要があります。

于 2013-07-08T14:30:26.087 に答える
0

次のように印刷してみてください。

NSLog(@"Type %@",self.WithdrawType);

合成しなかった場合、デフォルトで次のように合成されます。

@synthesize WithdrawType = _WithdrawType

したがって、自己を使用する必要があります。セッターにアクセスする

そうでない場合、同じコントローラーを使用していますか?

また試してください:

Denomination *deno= [[Denomination alloc] initWithNibName:@"Denomination" bundle:nil]; 
于 2013-07-08T13:04:56.160 に答える
0

実行順序の問題のように思えます。コントローラー C の -(id)viewDidLoad メソッドが deno.WithdrawType = @"ATM"; の前に実行されていると推測する必要がある場合。コントローラーAで。

いくつかのブレークポイントを設定するか、NSLog ステートメントを viewDidLoad から viewWillAppear に移動して、問題が解決するかどうかを確認してください。解決策として、おそらく -(id)initWithWithdrawType:(NSString *)withdrawType メソッドを作成して、View Controller を初期化し、データの流れを確実に制御することができます。

新しいメソッドで self = [super init] を実行すると viewDidLoad が実行される可能性があるため、最初にプロパティ値を設定することに注意してください。

于 2013-07-08T13:34:35.483 に答える
-2

必要がある

@property (retain,nonatomic) NSString *WithdrawType;

そのプロパティを .m クラスで合成します。

于 2013-07-08T13:08:50.467 に答える