我有一个视图控制器,它以模态方式呈现导航控制器。导航控制器有2个视图控制器。
这三个视图控制器中的每一个都被委托给一个链。
最顶层的视图控制器VC3,我想一直关闭回到显示导航控制器VC1的视图控制器。
所以在VC3中我调用我的代理VC2
[self.delegate newGameViewController:self submitRound:nil forGame:self.game];
VC2做出反应
-(void)newGameViewController:(NewGameViewController *)newGameViewController submitRound:(NSDictionary *)round forGame:(Game *)game
{
NSLog(@"Delegate Called");
[self.navigationController popViewControllerAnimated:NO];
[self.delegate turnViewController:self didCompleteTurnWithStats:[self statsWithOutcome:_wonTurn]];
}
这应该弹出导航控制器的顶视图,即VC3。然后调用它的委托,它是VC1 - 它呈现了UINavigationController
在VC1中
-(void)turnViewController:(TurnViewController *)turnViewController didCompleteTurnWithStats:(NSDictionary *)stats
{
[self.turnNav dismissViewControllerAnimated:NO completion:^{
[self updateData];
}];
}
这应该关闭整个导航控制器,VC1应该是可见的视图控制器。
但这不是个案。
相反,它会重新加载VC3的新实例。
只有当VC3可见并且然后重新打开,或者应用程序切换到后台并返回时,手机才会锁定。我遵循Apple的指导方针,只是通过提供它们的控制器解除视图控制器 - 但是我的呈现控制器仍然会被解除分配?至少那就是我所假设的事情。
反正有没有阻止这个?我尝试注册名称的通知:UIApplicationDidEnterBackgroundNotification尝试在此之前尝试和解雇 - 但它只触发一半的时间。
由于
编辑:这是我在VC1中的updateData方法的代码 - 在解除导航控制器之前调用。我更新了代码,在导航控制器被解除后调用它。没有改变问题。
-(void)updateData
{
[[GameManager instance] getGame:self.game withCompletion:^(Game *game, BOOL completed){
if(completed)
{
if(game.played){
[self loadGameComplete];
} else {
if(!roundsLoaded)
[self shouldLoadRounds];
if(UILoaded && roundsLoaded)
[self updateUI];
if(self.game.lastTurn.played && self.game.myTurn)
[self shouldSendPhoto];
}
} else {
if(!roundsLoaded)
[self loadError];
}
}];
}
编辑2:我现在在VC1中明确地解雇了导航控制器,我也有很强的参考价值。仍在重新加载VC3而不是解雇。
这是我在VC1中的方法,它以VC2作为根加载导航控制器。
-(void)loadTurn:(Turn *)turn
{
if(turn.played){ [self shouldSendPhoto]; return; }
TurnViewController *turnVC = [[TurnViewController alloc] initWithGame:self.game andTurn:turn];
turnVC.delegate = self;
self.turnNav = [[UINavigationController alloc] initWithRootViewController:turnVC];
self.turnNav.navigationBar.translucent = NO;
if(IS_IPHONE_4_OR_LESS)
self.turnNav.navigationBarHidden = YES;
[self presentViewController:self.turnNav animated:YES completion:nil];
}