2011-08-02 14 views
0

私はすべてのタブにコントローラがあるタブバーアプリケーションを実装しています。アプリケーションが実行されると、私はログインフォームでモーダルビューをスローします。ユーザーがログインすると、このモーダルビューが閉じられ、すべてのタブバーコントローラにユーザー名を渡したいと思います。私が代表者にidJson値を渡すために[[self delegate] passUserInfo:idJson];を呼び出す実装LoginViewController.hプロトコルとデリゲート、モーダルビューフォームからすべてのタブバーコントローラにデータを渡す

@protocol PassUserInfoDelegate <NSObject> 
@required 
    - (void) passUserInfo: (NSString *)string; 
@end 

@interface LoginViewController : UIViewController <UIApplicationDelegate> { 
    id <PassUserInfoDelegate> delegate; 
} 

とどこか: 私はモーダルビューコントローラLoginViewController.hで議定書を作成しました。私はHomeViewController.hで次に

、:

@interface HomeViewController : UIViewController <PassUserInfoDelegate> 

ので、このコントローラは、議定書のデリゲートです。 と実装HomeViewController.mに、私はプロトコルのメソッドを作成:

- (void) passUserInfo:(NSString *)string 
{ 
    NSLog(@"I got the string = %@", string); 
} 

を、私はLoginViewControllerにおけるプロトコルのデリゲートとしてHomeViewControllerを割り当てる:

- (void)viewDidLoad 
{ 
    loginViewController = [[LoginViewController alloc] init]; 
    [loginViewController setDelegate:self]; 
    [super viewDidLoad]; 
} 

これまでのところ、これが働いています。私はプロトコルからこのクラスにidJson文字列を取得します。 私が今やりたいことは、別のクラスで同じことをすることです。クラスにidJson値も渡したいと思っています。だから、私はHome2ViewController.h同じことで作成された:

@interface HomeView2Controller : UIViewController <PassUserInfoDelegate> 

とプロトコルメソッド作成:

- (void) passUserInfo:(NSString *)string 
{ 
NSLog(@"I got the string = %@", string); 
} 
    - (void)viewDidLoad 
{ 
    loginViewController = [[LoginViewController alloc] init]; 
    [loginViewController setDelegate:self]; 
    [super viewDidLoad]; 
} 

が、これをこのクラスのpassUserInfoメソッドが呼び出されることはありません。 私は何が間違っていますか?

ありがとうございます!

答えて

0

あなたの問題の1つは、HomeViewController2のビューは最初にアクセスしたときに読み込まれるだけなので、viewViewメソッドはHomeViewController2に対応するタブバー項目をタップするときに初めて呼び出されることです。

あなたの質問には多少無関係ですが、ヒントを与えるために[super viewDidLoad]呼び出しを - (void)viewDidLoadメソッドのTOPに移動してください。

HomeViewController2のメソッドviewDidLoadが呼び出されていた場合は、前のインスタンスで入力されたユーザー名情報を含まないモーダル(ログイン)ビューの新しいインスタンスを作成することになります。メソッドが呼び出されていても、コントローラに渡すユーザ情報はありません。

結論として、すべてのView Controllerにユーザー名を渡す必要はありません。あなたが保持したいすべてのユーザ属性(つまりユーザ名、電子メール、ファーストネーム、姓など)のインスタンス変数を持つユーザクラスオブジェクト(NSObjectのサブクラス)を作成し、それをシングルトンインスタンスにします(これはオプションですが、アプリライフサイクル全体を通じてこのクラスのインスタンス)。

アプリケーションデリゲートのクラスをインスタンス化するか、または(おそらくログインビューコントローラ内の)ユーザオブジェクトにアクセスする必要がある場合は、モーダルビューコントローラを設定または解除する必要がある属性を設定します。

ここから、ユーザーのインスタンスを要求し、コード内の任意の場所(タブバーコントローラの異なるビューコントローラを含む)からその属性にアクセスするだけで簡単にアクセスできます。ここで

はシングルトンユーザーオブジェクトの初期化方法の簡単な例です:

@implementation User 

static User *user_ = nil; 

+ (User*)sharedInstance 
{ 
    if (user_ == nil) 
    { 
     user_ = [[super allocWithZone:NULL] init]; 
    } 
    return user_; 
} 

そして、ここではあなたのコード内の任意の場所に「User.h」ヘッダファイルをインポートした後、ユーザーオブジェクトにアクセスすることができます方法は次のとおりです。

User *user = [User sharedInstance]; 
関連する問題