-(void)loginPerform
{
NSLog(@"start to perform segue!");
[self performSegueWithIdentifier:@"SecondPage" sender:self];
NSLog(@"end perform login!");
}
在回调函数中调用loginPerform函数。两个日志都可以打印,因此performSegueWithIdentifier可以执行。但是当前视图不会改变。
顺便说一句:我放了一个测试按钮直接执行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的测试按钮。它运作良好。
答案 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.
}
}