0

私はiosに少し慣れていませんが、混乱することはできました...今まで。ログインページのあるアプリケーションがあります。最初にしたことは、いくつかの空のビュー コントローラーを作成し、それらをストーリーボードに貼り付けることでした。userId と password のテキストフィールドとログインボタンを備えた LoginViewController があります。ログインに成功すると、TabViewController が表示されます。現在、これは箱から出しています。これで作成された 2 つの View Controller を削除し、それらを 2 つの NavigationController に置き換えました。

すべてをテストするために、ログイン ボタンから TabViewController へのセグエを作成しました。すべてがうまくいきました。意見が出ました。すぐに使用できるものはすべて機能しました。

次のステップでは、実際のログインをシミュレートしようとしました。Web サービス呼び出しを介してこれを行う必要があるため、非同期にする必要があると考えました。ログイン ボタンに追加した最初のセグエを削除し、ボタンから IBAction を LoginViewController に追加しました。また、LoginViewController から TabViewController に手動のセグエを追加し、「loginSegue」という名前を付けました。

これが私がこれまでに持っているコードです:

- (IBAction)login:(id)sender {
[Decorator showViewBusyIn:self.aView
            scale:1.5
        makeWhite:NO];

self.clientIdText.enabled = NO;
self.userIdText.enabled = NO;
self.passwordText.enabled = NO;
UIButton* loginBtn = sender;

loginBtn.enabled = NO;
[Decorator showViewBusyIn:self.aView
             scale:2.0
         makeWhite:NO];

self.operation = [[NSInvocationOperation alloc]
            initWithTarget:self
                  selector:@selector(doLogin)
                object:nil];
self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperation:self.operation];
}

-(void)doLogin{
    [NSThread sleepForTimeInterval:1];
    [Decorator removeBusyIndicatorFrom:self.aView];
// this is where I will eventually put the login code...
    [self performSegueWithIdentifier:@"loginSegue" sender:self];
}

Web サービスの呼び出しが完了するまでの待機をシミュレートするために、sleepForTimeInterval への呼び出しを行いました。後で削除します。デコレーターのものは、アクティビティインジケータービューを表示および削除するだけです。

これをすべて行うと、セグエは機能しますが、ログインビューコントローラーに関連付けられたビューは画面に残ります。別の言い方をすれば、TabViewController が表示されます。最初のアイテムが選択されます。NavigationController は表示されますが、それに関連付けられている VC とそれに含まれるビューは表示されません。LoginViewController からのビューはそこにとどまります。

ログインボタンにセグエを配置すると、すべてのナビゲーションが正常に機能したため、呼び出し操作と関係があると思います。それか、どういうわけか、ビューまたはビューコントローラーの階層がめちゃくちゃになっています。

私が間違っていることについてのアイデアはありますか?これはログインを行う良い方法ですか?

どんな助けでも大歓迎です、ナット

4

1 に答える 1

0

この種の操作では、GCD を使用する方が簡単な場合があります。あなたは次のようなことをします:

- (void)doLogin
{
    dispatch_queue_t loginQueue = dispatch_queue_create(“login”, NULL);
    dispatch_async(loginQueue, ^{         
        // this is where you will eventually put the login code...
        dispatch_async(dispatch_get_main_queue(), ^{
            [Decorator removeBusyIndicatorFrom:self.aView];
            [self performSegueWithIdentifier:@"loginSegue" sender:self];
        });
    }); 
}

そして、あなたの代わりに-(IBAction)login:(id)sender単に呼び出す[self doLogin]

self.operation = [[NSInvocationOperation alloc]
                                  initWithTarget:self
                                        selector:@selector(doLogin)
                                          object:nil];
self.queue = [[NSOperationQueue alloc] init];
[self.queue addOperation:self.operation];

GCD と NSOperationQueue の主な違いを簡単に説明しているこの質問を確認してください。

于 2013-05-22T12:50:48.310 に答える