1

私は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文字列を取得します何が間違っていますか?

前もって感謝します!!!

4

1 に答える 1

1

あなたの問題は、実際のデータを持つ既存の LoginViewController を使用する代わりにあることです。あなたのviewWillAppearは、接続を確立したことのない新しいものを作成し、その空のデータを取得しています。

最初にアプリ デリゲートで、HomeViewController(タブバーにあるもの) を、LoginViewController提示している へのデリゲートとして設定する必要があります。

次に、 からconnectionDidFinishLoading:を呼び出して、ログイン画面がデータを取得したこと[delegate passUserInfo:idJson];を に通知する必要があります。HomeVCあなたHomeVCpassUserInfo:方法はおそらくLoginVCwithを閉じるべきです[self.tabBarController dismissModalViewControllerAnimated:YES];(ログインビューはタブバーコントローラーから提示されたため)。

于 2011-07-31T20:15:23.223 に答える