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

loginPerform 函数在回调函数中调用。两个日志都可以打印,因此 performSegueWithIdentifier 执行。但当前视图不会改变。

  1. 视图 A 和视图 B 由 Custom Segue 连接。
  2. 视图 A 嵌入在导航控制器中。

BTW:我放了一个测试按钮直接执行segue,它可以工作。当调用 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
    }];
}

这是回调函数中调用的执行函数。只需 1 次打印

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

这是一个测试按钮,用于测试执行 segue。它运作良好。

4

2 回答 2

4

在执行 segue 之前,您需要等到其他视图控制器完成动画。您可以使用新的 iOS 5 方法:

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

如果您需要 iOS 5 之前的方法来执行此操作,您应该在执行 segue 之前添加一个延迟以给动画时间。

否则你可以去这里 iOS 委托不使用 performSegueWithIdentifier?

于 2013-06-25T06:46:26.327 回答
0

因为它是一个自定义的 segue,它不会自动推送第二个视图。你需要在你的类中实现 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 回答