Протокол и делегаты, передавая данные из модальной формы представления всем контроллерам панели вкладок - PullRequest
0 голосов
/ 02 августа 2011

Я реализую приложение панели вкладок, в котором на каждой вкладке есть контроллер.Когда приложение запускается, я выкидываю модальное представление с формой входа.Как только пользователь входит в систему, я отклоняю это модальное представление и хотел бы передать имя пользователя всем контроллерам панели вкладок.Я создал протокол в контроллере модального представления 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>

и создал метод Protocol:

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

, но этот метод passUserInfo в этом классе никогда не вызывается.Что я делаю не так?

Заранее спасибо !!

1 Ответ

0 голосов
/ 12 августа 2011

Одна из ваших проблем заключается в том, что представление вашего HomeViewController2 загружается только при первом обращении к нему, поэтому ваш метод viewDidLoad будет вызываться только при первом нажатии элемента панели вкладок, который соответствует HomeViewController2.

Есть несколько других проблем с вашим кодом, которые несколько не связаны с вашими вопросами, но чтобы дать вам подсказку, переместите вызов [super viewDidLoad] в верхнюю часть вашего - (void) метода viewDidLoad.

Также обратите внимание, что если бы вызывался ваш viewDidLoad метод на HomeViewController2, вы фактически создали бы новый экземпляр вашего модального представления (входа в систему), который бы не содержал информацию об имени пользователя, введенную в предыдущем экземпляре. Поэтому, даже если метод вызывается, пользовательская информация не будет передана на ваш контроллер.

Суть в том, что вам не нужно передавать имя пользователя всем контроллерам представления. Создайте объект класса User (подкласс NSObject) с переменными экземпляра для всех пользовательских атрибутов, которые вы хотите сохранить (например, имя пользователя, адрес электронной почты, имя, фамилия и т. Д.), И сделайте его экземпляром-одиночкой (это необязательно, но убедитесь, что у вас есть только один). экземпляр этого класса на протяжении всего жизненного цикла вашего приложения).

Создайте экземпляр класса в вашем делегате приложения или там, где вам сначала нужно получить доступ к объекту User (возможно, в вашем контроллере представления входа в систему), установите атрибуты, которые вам нужно установить, и отклоните модальный контроллер представления.

С этого момента вы можете просто запросить экземпляр пользователя и получить доступ к его атрибутам из любой точки вашего кода, включая другой контроллер представления в контроллере панели вкладок.

Вот простой пример метода инициализации для одноэлементного объекта 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...