8

AFNetworkingでユーザーがログインできるアプリケーションを開発しようとしています。データベースを正しく設定しましたが、ユーザーが最初にログオンしたときを除いて、すべてが正常に機能しているようです。

私が持っているものは非常に単純です:

[[API sharedInstance] commandWithParams:params
                               onCompletion:^(NSDictionary *json) {
                                   //result returned

                                   NSDictionary* res = [[json objectForKey:@"result"] objectAtIndex:0];

                                   if ([json objectForKey:@"error"]==nil && [[res objectForKey:@"UserID"] intValue]>0) {
                                       [[API sharedInstance] setUser: res];
                                       [self performSegueWithIdentifier:@"Login" sender:self];
                                   } else {
                                       //error
                                       [UIAlertView title:@"Error" withMessage:[json objectForKey:@"error"]];
                                   }

                               }];

基本的に、上記のコードはユーザーのログインの詳細の結果を返し、ログインの詳細が一致する場合にのみ成功します。上記のように、アプリケーション全体で使用されるsharedInstanceにユーザーを明確に設定しました。ユーザーが設定された後、ログインボタンが実行する必要があるため、セグエを実行しようとします。

セグエは発生し、プログラムは動作しますが、解決できない問題が2つあり、それを修正するために何時間も費やしてきました。まず、Xcodeの出力ウィンドウに次のメッセージが表示されます。

警告:プレゼンテーションの進行中に、LoginVCでUITabBarControllerを提示しようとしています!

次に、ユーザーが正しく設定されていることをテストするために、プロファイル画面(最初の画面)に、テキストが次のように設定されたラベルを付けます。

NSString stringWithFormat:@"Welcome %@",[[[API sharedInstance] user] objectForKey:@"username"]];

そして、ユーザー名が実際に表示されるか、次のように(null)と表示されるかは、ヒットまたはミスです。

ここに画像の説明を入力してください

また、ユーザーの値を出力ウィンドウに出力するために、そこで作成したボタンも表示されます。メッセージが「ようこそ(null)」でボタンを押しても、すべての値が正しく表示されているため、文字列にnullが表示されることがある理由がわかりません。

私が抱えている問題に関するストーリーボードの設定は次のとおりです。

ここに画像の説明を入力してください

誰かがこれについて私を助けてくれるなら、私は本当にそれをいただければ幸いです。

4

2 に答える 2

9

あなたが正しく診断したように、問題は間違いなくセグエの奇妙なおよび/または重複した呼び出しです。プロジェクトを見ると、問題は、「ログイン」ボタンにIBActionメソッドと、そのログイン画面から次のコントローラー(タブバーコントローラー)へのセグエの両方があることです。

IBActionとセグエの両方

ボタンを押すとセグエがトリガーされますが、- (IBAction)login:(id)senderコードによって再びトリガーされるため、これは問題です。

あなたはを持っているのでIBAction、セグエはボタンから次のコントローラーへではなく、コントローラー自体からのものでなければなりません。したがって、既存のLoginセグエをボタンから次の画面に削除し、コントローラー自体から再作成します。

コントローラから次のシーンへのセグエを作成する

その新しいセグエに「ログイン」識別子を与えると、「ログイン」ボタンは自動的にセグエ自体を実行しませんが、必要に応じIBActionて手動でその作業を実行しperformSegueWithIdentifierます。

于 2012-11-07T14:07:02.853 に答える
0

イベントの送信/トリガー:Did End On Exit

を呼び出すメソッドに接続しますperformSegueWithIdentifier

これにより、2 回トリガーされることはありません。

于 2013-01-11T14:16:43.327 に答える