Задача c: Протокол + делегат для передачи данных обратно из формы входа в модальном представлении в представление контроллера панели вкладок - PullRequest
1 голос
/ 01 августа 2011

Я разрабатываю приложение для iPhone на основе панели вкладок.Процесс следующий: при запуске приложения я выкидываю модальное представление с формой входа в систему:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.
tabBarController.delegate = self;

// Add the tab bar controller's view to the window and display. 
self.window.rootViewController = self.tabBarController;
[self addTabBarArrow];

LoginViewController *loginViewController = [[LoginViewController alloc] init];;
[window addSubview:tabBarController.view];
[self.tabBarController presentModalViewController:loginViewController animated:YES];
[window makeKeyAndVisible];
return YES; }

В модальном представлении входа в систему LoginViewController.h (child) У меня реализован протокол:

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

Когда пользователь заполняет форму, я создаю NSURLConnection, и в методе connectionDidFinishLoading я получаю пользовательские значения из запроса JSON:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *respuestaServidor = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
self.responseData = nil;

NSDictionary *dictionary = [respuestaServidor JSONValue];
idJson = [dictionary objectForKey:@"id"];
NSString *user_loginJson = [dictionary objectForKey:@"user_login"];

if ([idJson isEqualToString:@"null"] && [user_loginJson isEqualToString:@"null"]) {
    NSLog(@"Login incorrecto");
} else {
    NSLog(@"Procedo a loguear usuario");
}
[indicator stopAnimating];
[indicator release];
}

В HomeViewController.h (родитель) У меня есть делегирование:

@interface HomeViewController : UIViewController <PassUserInfoDelegate> {
LoginViewController *protocolTest;
IBOutlet UILabel *nombreUsuario;
NSString *usuario;
}
@property (nonatomic, retain) IBOutlet UILabel *nombreUsuario;
@property (copy) NSString *usuario;

- (void) passUserInfo:(NSString *)string;

@end

и в HomeViewController.m я реализую метод Protocol:

- (void) passUserInfo:(NSString *)jSonString
{
    userName.text = [[NSString alloc] initWithFormat:@"Welcome %@", jSonString];
}

и в методе viewDidAppear я вызываю loginSuccessметод, реализованный в классе LoginViewController

-(void) viewDidAppear:(BOOL)animated{
protocolTest = [[LoginViewController alloc] init];
[protocolTest setDelegate:self];
[protocolTest loginSuccess];
}

метод loginSuccess, реализованный в классе LoginViewController:

- (void)loginSuccess
{
    [[self delegate] passUserInfo:idJson];
}

, и он должен передать значение idJson HomeViewController (parent).Проблема в том, что когда я отклоняю модальную форму представления, значение idJson равно «NIL», поэтому в HomeViewController я не могу получить это значение.Если я сделаю это вместо:

[[self delegate] passUserInfo:@"hello"];

Я получу строку приветствия в HomeViewController (родительский) Что я делаю не так ?? *

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

1 Ответ

1 голос
/ 01 августа 2011

Ваша проблема в том, что вместо использования существующего LoginViewController, который имеет фактические данные. Ваш viewWillAppear создает новый, который никогда не устанавливал соединение, и получает пустые данные.

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

Затем с connectionDidFinishLoading: вы должны позвонить на [delegate passUserInfo:idJson];, чтобы сообщить HomeVC, что на экране входа в систему есть данные. Ваш HomeVC метод passUserInfo:, вероятно, должен отклонить LoginVC с помощью [self.tabBarController dismissModalViewControllerAnimated:YES]; (поскольку представление входа в систему было представлено с контроллера панели вкладок).

...