2011-08-02 35 views
0

我正在實現一個標籤欄應用程序,其中每個標籤都有一個控制器。當應用程序運行時,我用一個登錄表單拋出一個模態視圖。一旦用戶登錄,我將忽略此模式視圖,並且希望將用戶名傳遞給所有標籤欄控制器。 我創建在模態視圖控制器LoginViewController.h一個協議:協議和代表,將數據從模式視圖表單傳遞到所有標籤欄控制器

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

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

和在某處實施LoginViewController.h我打電話[[self delegate] passUserInfo:idJson];以便將idJson值傳遞給委託。

然後,在HomeViewController.h我做的:

@interface HomeViewController : UIViewController <PassUserInfoDelegate> 

所以該控制器是該協議的一個代表。 並在實施HomeViewController.m我創建協議的方法:

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

,我分配HomeViewController作爲協議的LoginViewController委託:

- (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

你的問題之一是你的HomeViewController2的視圖只在你第一次訪問時加載,所以你的viewDidLoad方法只會在你第一次點擊與HomeViewController2對應的標籤欄項時被調用。

您的代碼還有其他一些問題與您的問題無關,但爲了給您提示,請將[super viewDidLoad]調用移至您的 - (void)viewDidLoad方法的頂部。

另請注意,如果您在HomeViewController2上的viewDidLoad方法被調用,您將有效地創建模態(登錄)視圖的新實例,該實例不包含在前一個實例中輸入的用戶名信息。所以即使這個方法被調用,也不會有用戶信息傳遞給你的控制器。

底線是您不需要將用戶名傳遞給所有視圖控制器。創建一個User類對象(NSObject的子類),其中包含要保留的所有用戶屬性(即用戶名,電子郵件,名字,姓氏等)的實例變量並將其設置爲單例實例(這是可選的,但會確保只有一個整個應用生命週期中該類的實例)。

在您的應用程序委託或您首次需要訪問用戶objet(可能位於您的登錄視圖控制器)中的任何位置實例化類,設置您需要設置和關閉模態視圖控制器的屬性。

從這裏開始,您可以簡單地請求User實例並從代碼中的任何位置訪問其屬性,包括標籤欄控制器中的不同視圖控制器。

這裏有一個初始化方法的單身用戶對象一個簡單的例子:

@implementation User 

static User *user_ = nil; 

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

這裏就是你可以在你的代碼的任何地方導入「User.h」頭文件後訪問用戶對象:

User *user = [User sharedInstance]; 
相關問題