2011-08-02 33 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]; 
相关问题