繁体   English   中英

目标c:协议+委托,以将数据从模态视图中的“登录”表单传递回至选项卡控制器视图

[英]Objective c: Protocol + Delegate to pass data back from Login form in a Modal View to an tab bar controller view

我正在为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(子级)中,我实现了一个协议:

@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方法中,我调用在LoginViewController类中实现的loginSuccess方法

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

在LoginViewController类中实现的loginSuccess方法:

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

并将idJson值传递给HomeViewController(父级)。 问题是,当我关闭模式视图窗体时,idJson的值为“ NIL”,因此在HomeViewController中我无法获得该值。 如果我改为这样做:

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

我在HomeViewController中获得了hello字符串(父级)我在做什么错?

提前致谢!!!

您的问题是,而不是使用具有实际数据的现有LoginViewController。 您的viewWillAppear正在创建一个从未建立连接的新连接,并获取其空数据。

首先,在应用程序委托中,您需要将HomeViewController (选项卡中的一个)设置为要呈现的LoginViewController的委托。

然后,从connectionDidFinishLoading:您应该调用[delegate passUserInfo:idJson]; 通知HomeVC登录屏幕上有数据。 您的HomeVCpassUserInfo:方法可能应该使用[self.tabBarController dismissModalViewControllerAnimated:YES];关闭LoginVC [self.tabBarController dismissModalViewControllerAnimated:YES]; (因为登录视图是从选项卡控制器显示的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM