链接 uiviewcontroller 委托
Posted
技术标签:
【中文标题】链接 uiviewcontroller 委托【英文标题】:chaining uiviewcontroller delegates 【发布时间】:2013-10-21 19:00:22 【问题描述】:我有一个加载 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 -> 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 中: [自我dismissViewControllerAnimated:是完成:无]; [_st_delegate scorer_turn:self didFinish:YES]; 在 A 中(这是发生错误的地方):
-(void)scorer_turn:(scorer_turn *)controller didFinish:(BOOL)finish
[self dismissViewControllerAnimated:YES completion:nil];
【问题讨论】:
A 代表 B -> 代表解除 B 代表 C 代表解除 C 代表 B 代表解除 B ?这就是你所说的吗?如果是这样,这似乎是正确的,但在模式之间来回切换对用户来说很烦人 您能包含更多代码吗?你怎么叫dismissViewController...
不完全,两种选择:A 提出 B -> 代表解除 B。或者 A 提出 B -> 提出 C 代表解除 C 然后代表解除 B
【参考方案1】:
如果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: 根本不是您想要使用的。
【讨论】:
它们都是modalViewControllers,我没有发布的是我不需要单独关闭它们。因此,我没有试图从 B 中解雇 C,而是去 A 并从那里解雇。谢谢你的解释。以上是关于链接 uiviewcontroller 委托的主要内容,如果未能解决你的问题,请参考以下文章
将另一个 UIViewController 的视图放在“主”UIViewController 中——委托方法
从 appdelegate 设置 UIViewController 委托