2012-03-21 7 views
0

デリゲートとプロトコルで文字列を渡しています。文字列はクラスに正しく受信されますが、これはviewDidLoadメソッドが呼び出された後に発生します。 viewDidLoadメソッドには渡された文字列が必要です。iPhoneプロトコルデリゲート渡しデータ

私は、delegateメソッドをviewDidLoadの前に呼び出すために何ができるのですか?私は、これがデリゲート/プロトコルデータの受け渡しの考えだと思っていました。新しいビューが作成され、押し出され

方法:ViewControllerTwoで

ViewControllerTwo *two = [[ViewControllerTwo alloc] initWithNibName:@"ViewControllerTwo" bundle:nil]; 
two.delegate = self; 
[two setString:theString]; 
[self.navigationController pushViewController:two animated:YES]; 
[two release]; 

- (void)setString:(NSString *)str 
{ 
    self.myString = str; 
} 

編集:入力いただきありがとうございます。しかし、私はinitメソッドを通してこのデータを渡す方法を理解しています。私はプロトコルと代議員を最近テストしており、これを行う方法があるかどうかを見たいと思っていました。私は正常にこのようなデータを別のクラスに渡し、うまくいった。プロトコルメソッドは最初に文字列を設定するよう呼び出されました。データの受け渡しをよりきれいに処理するように思えました。

+0

私は自分の質問を編集しました。私は、これが別のクラスで働いているので、私が間違ってやっているのか、委任によって可能かどうかを見たいと思っています。デリゲートメソッドはinitとviewDidLoadの前に最初に呼び出されています。 – Vikings

答えて

1

Delegationが使用されている理由とその理由について少し混乱していると思います。 で何らかのアクションを実行していて、別のサブクラスにそのアクションが行われたこと、またはそのアクションの結果を通知する必要がある場合は、UIViewControllerサブクラスでプロトコルを作成することができます。

アクション(受信者)について知りたいサブクラスのためには、そのヘッダーファイル内のそのプロトコルに準拠している必要があります。

また、delegatereceiving class/controllerに「設定」する必要があります。

receiving controller/classへの参照をdelegateとして設定する方法はたくさんありますが、そのクラスが既に作成されている場合は、そのクラスの新しいインスタンスを割り当てて初期化してデリゲートとして設定するのがよくあります。それは、すでに作成されたクラスではなく、メッセージを待っている代わりに、新しく作成されたクラスをデリゲートとして設定することです。

新しく作成されたクラスに値を渡すだけです。このUIViewControllerクラスを作成するだけで、それに必要なものはすべてreceiver(ViewControllerTwo)のプロパティです。

あなたの場合

NSString

@Property (nonatiomic, retain) NSString *string; //goes in ViewControllerTwo.h 

そしてもちろん、メインで忘れてはいけない:

@synthesize string; //Goes in ViewControllerTwo.m 

は今、あなたのViewControllerTwoでセッターのための必要はありません。

- (void)setString:(NSString *)str //This Method can be erased 
    {         //The setter is created for free 
     self.myString = str;   // when you synthesized the property 
    } 

@synthesizeを使用するとセッターとゲッターは無料です。値をViewControllerに渡すだけです。実装はデリゲート以外のコードと同じです。

ViewControllerTwo *two = [[ViewControllerTwo alloc] initWithNibName:@"ViewControllerTwo" bundle:nil]; 
    [two setString:theString]; 
    [self.navigationController pushViewController:two animated:YES]; 
    [two release]; 
0

初期化フェーズでその文字列を渡す必要がある場合は、initメソッドで渡すことができます。

だからあなたのコントローラで、あなたがこのような性質と追加のinitメソッドを作成する必要があります。

の.h

@property (nonatomic, copy) NSString* myString; 

-(id)initWithString:(NSString*)theString; 

.M

@synthesize myString; 

-(id)initWithString:(NSString*)theString { 
    self = [super initWithNibName:@"ViewController" bundle:nil]; // I prefer to set the name of the controller internally 
    if(self) { 
     myString = [theString copy]; 
    } 
    return self; 
} 

、その後、どこself.myStringを使用欲しいです。

ARCを使用しない場合は、必ずリリースしてください。

- (void)dealloc 
{ 
    [myString release]; 
    [super dealloc]; 
} 
0

あなたは、例えば、ViewControllerTwoのカスタム初期化子を作成することができますViewControllerOneで

- (id)initWithString:(NSString *)aString; 
{ 
    self = [super initWithNibName:@"ViewControllerTwo" bundle:nil]; 
    if(!self) return nil; 

    self.myString = aString; 
    // other initialization 

    return self; 
} 

あなたの初期化は、単に次のようになります。

ViewControllerTwo *vc = [[ViewControllerTwo alloc] initWithString:theString]; 
[[self navigationController] pushViewController:vc animated:YES]; 
[vc release]; 
0

私はこのためのプロトコルを使用することはありません。親ビューコントローラから子にデータを渡すには、カスタム初期化メソッドを使用します。 ViewControllerTwo.hで

-(id)initWithString:(NSString *)str; 

そして、あなたのViewControllerTwo.mでその実装:

-(id)initWithString:(NSString *)str { 
    self = [super self]; 
    if(self) { 
     self.myString = str; 
    } 
    return self; 

をそしてあなたのViewController 1のそれを呼び出すために:

ViewControllerTwo *two = [[ViewControllerTwo alloc] initWithString:@"Cool String"]; 
0

initメソッドまたはviewDidLoadにデータを配置することはできません。これは、ユーザーがUビューをロードするか、View Controllerを再初期化します。

変更するデータを取得する最適な場所は、viewWillAppearコントローラメソッドです。これにより、ユーザーが切り替えるたびにデータが更新されます。

別の最善の方法は、MVCアーキテクチャを使用することです。データを保持するだけのモデルクラスがあれば、どのコントローラからでも書き込み/更新が可能です。

+0

deallocメソッドが呼び出され、ビューがロードされるたびに作成され、データが正しく渡されるようにします。 – Vikings

+0

私は、MVCがただ1つのオブジェクトが渡されているので、MVCを使いたくありません。私のプロジェクトには残酷なもののようです。 – Vikings

関連する問題