2009-07-14 15 views
0

私はiPhoneアプリケーションを開発中です。アプリケーションが起動すると、認証、接続の確立、XMLファイルの形式でのデータの取得、パース、テーブルビューの表示などができます。 これは私の問題です。 ユーザー情報が既にアプリケーションに格納されている場合、またはコードにハードコードされている場合、アプリケーションは認証ユーザー名とパスワードを取得し、表形式でデータを表示します。ハードコードされたデータでテストを行っていました。今度は、ユーザー名とパスワードがアプリケーション内に存在しない場合は、そのユーザー名とパスワードを要求する別のビューを表示したいと考えています。静的ではなく、ユーザー名とパスワードを動的にする必要があります。 私の場合、ユーザー名とパスワードの入力が忙しい場合、「viewDidLoad」メソッドは、サーバー接続とテーブルのロードに失敗した空のユーザー名とパスワードでサーバーとの接続を確立しようとします。しかし、2回目にアプリケーションを実行すると、以前に入力したユーザー名とパスワードが検索され、テーブルが正常に読み込まれます。メソッドを遅延させる方法は?

アプリケーションがユーザー名とパスワードを見つけられない場合、サーバー接続のプロセスを遅延させる方法はありますか?ユーザーがユーザー名とパスワードを入力した後、サーバーの接続方法を知らせるにはどうすればよいですか?

ありがとうございました。

答えて

1

コードを投稿することはできますか?何が起こっているのかを見ずに推測するのは難しいですが、とにかく試してみましょう。

viewDidLoadからサーバーに接続するコードを移動して、コールバックメソッドなどに配置する必要があります。私は、名前とパスワードフィールドでアラートを投げ、あなたのView Controllerをアラートのデリゲートにしてから、clickedButtonAtIndex関数をサーバーに接続させることをお勧めします。

例:

-(void)viewDidLoad { 
    UIAlertView *loginAlert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"Please enter your username and password below" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Login",nil]; 

    //You might have to do some fiddling with the frame sizes to make it fit in the alert. 
    UITextField *userNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)]; 
    userNameField.placeholder = @"User Name"; 
    [loginAlert addSubview:userNameField]; 
    //loginAlert will retain this so we release it now. 
    [userNameField release]; 



    [UITextField *passwordNameField = [[UITextField alloc] initWithFrame:CGRectMake(originX, originY, lengthX, lengthY)]; 
    passwordNameField.secureTextEntry = YES; 
    [loginAlert addSubview:passwordNameField]; 
    [passwordNameField release] 

    //This line tells the iPhone to stretch out your AlertView so it's big enough for your two textViews, we use 0 and 130 respectively but we only have one text field. 
    CGAffineTransform myTransform = CGAffineTransformMakeTranslation(stretchX, stretchY); 

    [loginAlert setTransform:myTransform]; 
    [loginAlert show]; 
    [loginAlert release]; 
} 


//Implement this method, it will be called when the user clicks the "login" button on your alert. 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    //Usually if they click cancel you do nothing, thats buttonIndex 0 
     if(buttonIndex == 1) { 
     //Connect to the server with the correct login and password. 
    } 
} 
+0

こんにちはティムする必要があるときに呼び出され、別の方法で、あなたの提案をありがとうを持っている、のviewDidLoadでテーブルの読み込みを行い、すべてのコードを使用することはできません。アラートを使用してユーザー名とパスワードを入力すると、問題が解決しました。 2番目のビューでユーザー名とパスワードを入力していたので、2番目のビューでLoginボタンをクリックしたときに、ルートビューでテーブルビューを再読み込みする問題が発生しました。私のルートビューは、タブコントローラー、ナビゲーションコントローラー、テーブルビュー、および3ボタンのセグメント化されたコントロールを含む複雑なものです。だから、サブビューでログインボタンがクリックされたときに、ルートビューテーブルを更新するのが難しいと思っていました。あなたの提案をありがとう、それは今素晴らしいです。 –

+0

お手伝いをしてうれしい! –

+0

UIAlertにUITextFieldを追加するのは、AppleのHIGに対するものです。このソフトウェアをApp Storeに提出する予定がある場合、UIAlertの代わりにモーダルビューを表示する方が安全でしょう(-presentModalViewController:animated :)。 – leolobato

0

ビューをウィンドウ内に表示したら、ViewDidLoadは常に呼び出されます。その理由は、呼び出されたviewDidLoad ...なぜなら、実行する必要があるのは、ログイン手順の別のビューを作成し、ユーザーがログインしたときです。彼らはあなたの安らかなサービスに接続するビューを押すログインボタンをクリックします。ユーザーデータが既に存在する場合は、ログインページを一斉にスキップしてテーブルビュービューに直接移動します。

+0

あなたはまた、ofcourseの代わりに、あなたはそれが – Daniel

関連する問題