performSegueWithIdentifier无法在回调函数中工作?

时间:2013-06-25 06:29:28

标签: ios function callback segue

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

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

  1. 视图A和视图B由Custom Segue连接。
  2. 查看嵌入导航控制器。
  3. 顺便说一句:我放了一个测试按钮直接执行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的测试按钮。它运作良好。

2 个答案:

答案 0 :(得分:4)

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

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

如果您需要iOS 5之前的方法,那么您应该在执行segue之前添加延迟以提供动画时间。

否则你可以到这里iOS delegate not working with performSegueWithIdentifier?

答案 1 :(得分: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.
       }
  }