ios - 如何在继续之前确保操作完成

标签 ios objective-c methods

我想知道是否有办法强制首先发生第一件事(即关闭 UIviews)然后继续当前方法?

这就是我的方法

- (void)selectDeselectAllPressed:(UIButton*)button {
    int id = button.tag;
    [SVProgressHUD showWithStatus:@"Updating" maskType:SVProgressHUDMaskTypeGradient];
    [self displaySelected]; // removes current view so you can load hud will not be behind it

    if (id == 1) {
        [self selectAllD];
    } else if (id == 2) {
        [self deselectAllD];
    } else if (id == 3) {
        [self selectAllI];
    } else if (id == 4) {
        [self deselectAllI];
    }
}

如您所见,按下按钮时会调用此方法,我希望 displaySelected 方法在调用任何其他方法之前执行它需要执行的操作?

目前,当我调试 this is displaySelected 方法时会发生什么,线程遍历该方法,然后继续执行 if 语句,然后在 if 语句中的方法完成后,对 displaySelected 进行更改...这太奇怪了。

更新

这是我正在调用的方法,有一个 if 语句检查 View 是否为 nil 然后加载它,否则卸载它。在我在 View 上的代码中加载时,当我从 selectDeselectAllPressed 调用它时,它正在输入 else if 方法的一部分来关闭 View 。我调试过看到线程进入这个点

- (void) displaySelected {

    if (allBackGroundView == nil) {

        // load view

        CGFloat fullHeight = [UIScreen mainScreen].bounds.size.height;
        CGFloat fullWidth = [UIScreen mainScreen].bounds.size.width;

        // draw background
        background = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, fullHeight, fullWidth)];
        background.backgroundColor = [UIColor blackColor];
        background.alpha = 0.6;
        [self.view addSubview:background];

        UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(displaySelectedI)];
        gestureRecognizer.cancelsTouchesInView = NO;
        [background addGestureRecognizer:gestureRecognizer];

        allBackGroundView = [[UIView alloc] initWithFrame:CGRectMake(762.0, 43.0, 250.0, 220.0)];
        allBackGroundView.backgroundColor = [UIColor lightGrayColor];
        allBackGroundView.layer.borderWidth = 0.5;
        allBackGroundView.layer.borderColor = [UIColor darkGrayColor].CGColor;
        [self.view addSubview:allBackGroundView];

        // set labeltitles
        selecteAllDFitLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 18.0, 200.0, 30.0)];
        selecteAllDFitLabel.backgroundColor = [UIColor clearColor];
        selecteAllDFitLabel.font = [UIFont boldSystemFontOfSize:16];
        selecteAllDFitLabel.textColor = [UIColor whiteColor];
        selecteAllDFitLabel.text = @"Select all Dfit:";
        [allBackGroundView addSubview:selecteAllDFitLabel];

        deselecteAllDFitLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 65.0, 200.0, 30.0)];
        deselecteAllDFitLabel.backgroundColor = [UIColor clearColor];
        deselecteAllDFitLabel.font = [UIFont boldSystemFontOfSize:16];
        deselecteAllDFitLabel.textColor = [UIColor whiteColor];
        deselecteAllDFitLabel.text = @"Deselect all Dfit:";
        [allBackGroundView addSubview:deselecteAllDFitLabel];

        selecteAllILabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 120.0, 200.0, 30.0)];
        selecteAllILabel.backgroundColor = [UIColor clearColor];
        selecteAllILabel.font = [UIFont boldSystemFontOfSize:16];
        selecteAllILabel.textColor = [UIColor whiteColor];
        selecteAllILabel.text = @"Select all I:";
        [allBackGroundView addSubview:selecteAllILabel];

        deselecteAllILabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 170.0, 200.0, 30.0)];
        deselecteAllILabel.backgroundColor = [UIColor clearColor];
        deselecteAllILabel.font = [UIFont boldSystemFontOfSize:16];
        deselecteAllILabel.textColor = [UIColor whiteColor];
        deselecteAllILabel.text = @"Deselect all I:";
        [allBackGroundView addSubview:deselecteAllILabel];

        UIImage* okImage = [UIImage imageNamed:@"OK.png"];
        UIImage* noImage = [UIImage imageNamed:@"No.png"];

        selecteAllDFitButton =[UIButton buttonWithType:UIButtonTypeCustom];
        selecteAllDFitButton.tag = 1; // so I know what action to perform when i call selectDeselectAllPressed
        [selecteAllDFitButton addTarget:self
                       action:@selector(selectDeselectAllPressed:)
             forControlEvents:UIControlEventTouchUpInside];
        selecteAllDFitButton.frame = CGRectMake(200.0, 12.0, 40.0, 40.0);
        [selecteAllDFitButton setImage:okImage forState:UIControlStateNormal];
        [allBackGroundView addSubview:selecteAllDFitButton];

        deselecteAllDFitButton =[UIButton buttonWithType:UIButtonTypeCustom];
        deselecteAllDFitButton.tag = 2;
        [deselecteAllDFitButton addTarget:self
                                   action:@selector(selectDeselectAllPressed:)
                         forControlEvents:UIControlEventTouchUpInside];
        deselecteAllDFitButton.frame = CGRectMake(200.0, 62.0, 40.0, 40.0);
        [deselecteAllDFitButton setImage:noImage forState:UIControlStateNormal];
        [allBackGroundView addSubview:deselecteAllDFitButton];

        selecteAllIButton =[UIButton buttonWithType:UIButtonTypeCustom];
        selecteAllIButton.tag = 3;
        [selecteAllIButton addTarget:self
                                     action:@selector(selectDeselectAllPressed:)
                           forControlEvents:UIControlEventTouchUpInside];
        selecteAllIButton.frame = CGRectMake(200.0, 112.0, 40.0, 40.0);
        [selecteAllIButton setImage:okImage forState:UIControlStateNormal];
        [allBackGroundView addSubview:selecteAllIButton];

        deselecteAllIButton =[UIButton buttonWithType:UIButtonTypeCustom];
        deselecteAllIButton.tag = 4;
        [deselecteAllIButton addTarget:self
                                    action:@selector(selectDeselectAllPressed:)
                          forControlEvents:UIControlEventTouchUpInside];
        deselecteAllIButton.frame = CGRectMake(200.0, 162.0, 40.0, 40.0);
        [deselecteAllIButton setImage:noImage forState:UIControlStateNormal];
        [allBackGroundView addSubview:deselecteAllIButton];


    }
    else {
        [allBackGroundView removeFromSuperview];
        [background removeFromSuperview];
        allBackGroundView = nil;
        background = nil;

    }
}

最佳答案

您需要创建一个基于 block 的 API,并将一个 block 传递给 displaySelected

考虑:

- (void)selectDeselectAllPressed:(UIButton*)button {
    int id = button.tag;
    [SVProgressHUD showWithStatus:@"Updating" maskType:SVProgressHUDMaskTypeGradient];
    [self displaySelectedCompletionBlock: ^ (BOOL completed) {
        if(!completed) { return; }

        if (id == 1) {
            [self selectAllD];
        } else if (id == 2) {
            [self deselectAllD];
        } else if (id == 3) {
            [self selectAllI];
        } else if (id == 4) {
            [self deselectAllI];
        }
    }]; // removes current view so you can load hud will not be behind it
}

并且在 displaySelectedCompletionBlock: 中:

- (void)displaySelectedCompletionBlock:(void(^)(BOOL))completionBlock
{
    //Setup animations.
    [UIView animateWithDuration:0.5 animations: ^ { /* Do animations here. */ } completion:[completionBlock copy]];
}

这是一个简化,但应该让您了解如何继续。

关于ios - 如何在继续之前确保操作完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19872144/

相关文章:

iphone - 在 Objective C/C 中将字符串中的数值转换为整数

ios - 自动居中 UIViews

ios - 数组到集合的转换需要 20 秒 - Swift 3

ios - 在 icloud 上禁用文档文件夹及其所有子文件夹的备份?

ios - 使用自定义字段扩展 NSMutableURLRequest

java - 从方法分配一个数组

ios - 如何在 Swift 中获取屏幕边缘的 X 和 Y

ios - UINavigationBar外观未正确设置颜色

c# - 动态替换 C# 方法的内容?

c++ - 如何在一种日志机制中捕获特定方法的调用