![](/img/trans.png)
[英]Protocol and Delegates, passing data from a modal view form to all the tab bar controllers
[英]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
登录屏幕上有数据。 您的HomeVC
的passUserInfo:
方法可能应该使用[self.tabBarController dismissModalViewControllerAnimated:YES];
关闭LoginVC
[self.tabBarController dismissModalViewControllerAnimated:YES];
(因为登录视图是从选项卡控制器显示的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.