我正在处理一个segue问题而且它变得荒谬了。
我正在执行它,就像我在名为LoginViewController
的视图控制器中一样:
- (void)loginSuccessfullyAccomplished
{
[self performSegueWithIdentifier:@"switchToHome" sender:self];
}
上面的方法是从另一个类中调用的,其中一些其他签名操作是异步执行的,一旦完成,它就会从LoginViewController.m
调用此方法:
// Some Code
.
.
.
.
case VIDYO_CLIENT_OUT_EVENT_SIGNED_IN:
{
/*** Notifying upper layer ( Login View Controller ) from signing in ***/
UIStoryboard *storyboard;
if ( IDIOM == IPAD )
{
storyboard = [UIStoryboard storyboardWithName:@"MasterStoryboard-iPad" bundle:nil];
}
else if ( IDIOM == IPHONE )
{
storyboard = [UIStoryboard storyboardWithName:@"MasterStoryboard-iPhone" bundle:nil];
}
UINavigationController *nav = [storyboard instantiateInitialViewController] ;
dispatch_async(dispatch_get_main_queue(), ^{
[nav.viewControllers[0] loginSuccessfullyAccomplished];
});
break;
}
.
.
.
.
//Rest of the code
现在,问题在于:
loginSuccessfullyAccomplished
被成功调用(使用断点来确保这一点),但我没有看到第二个视图控制器出现在屏幕上。
执行performSegue
时没有错误也没有异常,这意味着我没有对segue标识符或从中执行segue的第一个视图控制器做出任何错误。
我也确定我正在使用push segue,并且我已将视图控制器嵌入到导航控制器中。
为了确保我没有对segue本身做任何错误,我实现了prepareForSegue
方法并且它正在被调用。我也检查过它指向正确的目的地:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ( [segue.destinationViewController isKindOfClass:[UserHomeViewController class]] )
{
NSLog(@"YES");
}
}
第二个视图控制器在视觉上与第一个视图控制器不相似,所以我肯定会注意到它是否会发生变化。
我不知道出了什么问题。任何建议都非常感谢。
感谢。
P.S:我知道有几十个“performSegueWithIdentifier
没有被称为”问题,但没有一个问题对我有帮助!
答案 0 :(得分:2)
该方法被成功调用,但在哪个实例上? IDIOM == IPHONE
块中的代码非常可疑。它在一个全新的实例上调用loginSuccessfullyAccomplished
,一个尚未呈现的实例,因此我们不会在UI中看到任何变化,这并不奇怪。
我认为您在运行登录逻辑的对象中需要的是对实际呈现的LoginViewController
实例的引用。您可以通过将其作为委托来实现。也许更好,不要打扰指针....让登录逻辑发布一个NSNotification
登录已经完成,并让LoginViewController
观察并解雇自己。