在iOS中快速切换视图

时间:2014-05-13 15:01:14

标签: ios objective-c segue

我有一个视图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];

2 个答案:

答案 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];    
}];