0

我有一个加载 uiviewcontroller (B) 的 uivewcontroller(我们称之为 A),将其设置为我用来关闭 B 并继续在 A 上执行代码的委托。还有一个场景,其中 B 通向另一个 uiviewcontroller C(再次带有代表)。当 C 关闭时,我使用它的委托返回 B,但在这种情况下,我也希望 B 立即被解除,代码返回 A。现在,B->A 工作,C->B 工作,但做 C- >B->A 在 B 处失败并出现错误:“尝试关闭其视图当前未出现的模态视图控制器”它似乎正在尝试再次关闭视图 C。

两个视图控制器都被这段代码解散(尽管代码位于不同的 uiviewcontrollers 中)

[self dismissViewControllerAnimated:YES completion:nil];

我是否正确使用代表来满足我的需求,还是应该使用不同的流程?

选项 1 的代码(A->B,B<-A):

A -> B

scorer_turn *st = (scorer_turn *) segue.destinationViewController;
st.st_delegate=self;
st.league = _match.league;
st.match = _match;
st.leg = _leg;
st.set = _set;

B -> A

-(void)closeView{
[_st_delegate scorer_turn:self didFinish:YES];
}

-(void)scorer_turn:(scorer_turn *)controller didFinish:(BOOL)finish{
    [self dismissViewControllerAnimated:YES completion:nil];
}

选项 2 的代码(A->B、B->C、C->B->A):

如上加:B -> C

matchSummaryViewController *ms = (matchSummaryViewController *) segue.destinationViewController;
ms.match = _match;
ms.oneScreen = NO;
ms.delegate = self;
[[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];

C -> B, B -> A

在 C 中:[_delegate matchSummaryViewController:self didFinish:YES]; 在 B 中:[self dismissViewControllerAnimated:YES 完成:nil];[_st_delegate scorer_turn:self didFinish:YES]; 在 A 中(这是发生错误的地方):

-(void)scorer_turn:(scorer_turn *)controller didFinish:(BOOL)finish{
    [self dismissViewControllerAnimated:YES completion:nil];
}
4

1 回答 1

0

如果 ViewController B 是一个 modalViewController,并且 ViewController C 被推送到同一个 modalViewController 上,那么调用

[self dismissViewControllerAnimated:YES completion:nil];

应该关闭整个模态视图 - 例如,它将完全关闭 C 并跳过 B(B 甚至不会出现),如果 B 尝试也调用dismissViewControllerAnimated:completion会导致问题:因为没有更多的模态视图解雇。

现在,如果您有一些其他设置,例如 B 是一个模态,当推动 C 时,它实际上会自行关闭并启动一个新的模态视图(如果您总是使用presentViewController:animated:completion函数,就会发生这种情况),那么你还有其他设计问题 - 你不应该像那样交换模态视图,而是使用

[self.navigationController pushViewController:C animated:YES]

显示视图和

[self.navigationController popViewControllerAnimated:YES]

关闭视图 C 并返回视图 B。

这当然是假设您正在使用 navigationController 来管理您的视图(您通常应该这样做)。

另一方面,如果您根本不使用模态视图,那么dismissViewControllerAnimated:completion : 根本不是您想要使用的。

于 2013-10-21T19:10:19.363 回答