1
 -(void)loginPerform
{
    NSLog(@"start to perform segue!");
    [self performSegueWithIdentifier:@"SecondPage" sender:self];
    NSLog(@"end perform login!");
}

loginPerform 関数はコールバック関数で呼び出されます。2 つのログはどちらも出力できるため、performSegueWithIdentifier が実行されます。ただし、現在のビューは変更されません。

  1. ビューAとビューBはカスタムセグエで接続されています。
  2. ビュー ナビゲーション コントローラーの埋め込み。

ところで:セグエを直接実行するテストボタンを配置しましたが、動作します。loginPerform 関数が呼び出されると、テスト ボタンをクリックすると、次のビューは常にビュー A になります。

何が起こったのか理解できません。誰か助けてくれませんか?

int user_account_delegate(int reqid, char* msg)
{
    NSLog(@"DEBUG: login return %s", msg);
    int reterr = 0;

    if(reqid!=[BLSInstLink getLoginID])
        return -1;

    /* parse the login result (JSON) */
    if(get_json_object_value(msg, KEY_ERROR, VAL_INTEGER, (void*)&reterr)==0)
    {
        if(reterr==0)
        {
            NSLog(@"DEBUG: login succeed.");
            [BLSInstLink setLogined:YES];
            BLSViewController *this = THIS;
            [this loginPerform];
        }
        else
        {
            NSLog(@"DEBUG: login failed. err=%d", reterr);
            [BLSInstLink setLogined:NO];
            [BLSInstLink setErrorCode:reterr];
        }
    }
    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_LOGINRESULT object:nil];
    return 0;
}

これは、私自身の UIViewController に実装するコールバック関数です。

-(void)loginPerform{
    NSLog(@"in loginPerform");//1
    [self dismissViewControllerAnimated:YES completion:^() {
        NSLog(@"start perform page2");//2
        [self performSegueWithIdentifier:@"SecondPage" sender:self];
        NSLog(@"end perform page2");//3
    }];
}

これは、コールバック関数で呼び出される実行関数です.Just 1 print

- (IBAction)test_click:(id)sender {
 [self performSegueWithIdentifier:@"SecondPage" sender:self];
}

これは、セグエの実行をテストするためのテスト ボタンです。そしてそれはうまくいきます。

4

2 に答える 2

4

セグエを実行する前に、他のView Controllerのアニメーションが完了するまで待つ必要があります。新しい iOS 5 メソッドを使用できます。

[self dismissViewControllerAnimated:YES completion:^() {
    [self performSegueWithIdentifier:@"My Segue" sender:self];
}];

iOS 5 より前の方法でそれを行う必要がある場合は、セグエを実行する前にアニメーション時間を与えるために遅延を追加する必要があります。

それ以外の場合は、ここに移動できます iOS デリゲートが performSegueWithIdentifier で動作していませんか?

于 2013-06-25T06:46:26.327 に答える
0

これはカスタム セグエであるため、2 番目のビューを自動的にプッシュすることはありません。クラスに prepareForSegue 関数を次のように実装する必要があります。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
       if ([segue.identifier isEqualToString:@"SecondPage"])
       {       
          secondViewController = [segue destinationViewController];
           //add second view as subview of first view.
       }
  }
于 2013-06-25T06:43:52.717 に答える