我有一个视图A,一个视图B和一个视图C.这个想法是:我在视图A上呈现视图B,视图B在视图A中有一个执行segue的委托:视图C. / p>
我的问题是我收到了消息"在演示文稿正在进行时尝试在视图A上显示视图B"。
我可以让它在执行segue的视图A方法中添加延迟,但是不是有更好的方法使它工作吗?
在视图A中,委托方法:
- (void)addItemViewController:(NSString *)string text:(NSString *)textfield{
[self barcodeData:string type:1 :^(BOOL finished) {
if(finished){
[self performSegueWithIdentifier:@"viewC" sender:self];
}
}];
}
在视图B中
[self.delegate addItemViewController:saisieManuelleTextView.text text:nil];
[self dismissViewControllerAnimated:NO completion:nil];
答案 0 :(得分:2)
尝试在动画完成处理程序中调用委托(在发布中有一些重叠,因为redent84也建议这样做):
[self dismissViewControllerAnimated:YES completion:^{
[self.delegate addItemViewController:saisieManuelleTextView.text text:nil];
}];
通过这种方式,您仍然可以获得代理的好处,并避免同时使用视图控制器动画。
更好的是,如果视图A呈现视图B,那么使viewA也负责解雇viewB,而不是让viewB解雇自己。这样,viewB不必知道它是如何呈现的:
- (void)addItemViewController:(NSString *)string text:(NSString *)textfield{
[viewB dismissViewControllerAnimated:YES completion:^{
[self barcodeData:string type:1 :^(BOOL finished) {
if(finished){
[self performSegueWithIdentifier:@"viewC" sender:self];
}
}];
}];
}
答案 1 :(得分:0)
您看到的问题与过渡动画有关。您正尝试为从视图A到视图C的转换设置动画,同时已经从视图B激活转换回视图A.
尝试使用completion
方法的dismissViewControllerAnimated
块:
[self dismissViewControllerAnimated:YES completion:^{
[self performSegueWithIdentifier:@"MySegue" sender:self];
}];
或尝试禁用从视图B到视图A的过渡动画,以便它完全不受影响:
// For navigation controllers
[self.navigationController popViewControllerAnimated:NO];
// For modal controllers
[self dismissViewControllerAnimated:NO completion:nil];
修改强>
在解除前一个控制器之前,您正在展示新控制器,请更改以下行:
[self.delegate addItemViewController:saisieManuelleTextView.text text:nil];
[self dismissViewControllerAnimated:NO completion:nil];
到此:
[self dismissViewControllerAnimated:NO completion:nil];
[self.delegate addItemViewController:saisieManuelleTextView.text text:nil];
或者,您可以使用完成块来维护动画,如上所述:
[self dismissViewControllerAnimated:YES completion:^{
[self.delegate addItemViewController:saisieManuelleTextView.text text:nil];
}];