我想知道是否有办法强制首先发生第一件事(即关闭 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/