[英]UIButton disabled state not changing immediately
我有一個UIButton
設置,我想用它來告訴用戶正在發生的事情而不是僅僅為這個實例使用加載器。
例如, UIControlStateNormal
具有:
背景綠色
標題文字白色
標題 - 點擊發送
然后UIControlStateDisabled
具有:
背景白色
標題文字綠色
標題 - 發送
然后當單擊按鈕時,我們將按鈕更新為enabled = NO;
。
問題
我注意到的問題是當按鈕被更改為禁用(啟用NO)時,標題文本,顏色,背景的更改在完成所有方法調用等之后才會完成,所以為時已晚。
我讀了一些其他線程來使用btn layoutIfNeeded
和/或btn setNeedsLayout
。 這些實際上是強制按鈕更新,但似乎在所有其他調用/方法完成之后才會發生。 因此更新按鈕文本等為時已晚
有關如何使按鈕立即更新其狀態和屬性然后完成其他任務的任何想法? 我已經檢查過以確保它在主線程上並且所有更新/調用都不是問題。
編輯
基本上,當點擊按鈕時,我們更新狀態:
- (IBAction)sendFeedbackButtonPressed:(id)sender {
DebugLog(@"selected: %@",self.sendFeedbackButton.selected ? @"Yes" : @"No");
DebugLog(@"highlighted: %@",self.sendFeedbackButton.highlighted ? @"Yes" : @"No");
dispatch_async(dispatch_get_main_queue(), ^{
[self shouldFeedbackButtonBeEnabled:NO];
DebugLog(@"enabled: %@",self.sendFeedbackButton.enabled ? @"Yes" : @"No");
});
dispatch_async(dispatch_get_main_queue(), ^{
NSString *errorMessage = [self validateForm];
if (errorMessage) {
[[[UIAlertView alloc] initWithTitle:nil message:errorMessage delegate:nil cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"Feedback Form Validation Error Ok Button", nil), nil] show];
[self shouldFeedbackButtonBeEnabled:YES];
return;
}
//TODO: send it
// Send the form values to the server here.
[self sendFeedbackToParse];
});
}
-(void)setupSendFeedbackButton {
UIColor *mainColor = [UIColor colorWithRed:41/255.0f green:128/255.0f blue:185/255.0f alpha:1];
self.sendFeedbackButton.clipsToBounds = YES;
self.sendFeedbackButton.layer.cornerRadius = 5.0f;
self.sendFeedbackButton.layer.borderWidth = 2;
self.sendFeedbackButton.layer.borderColor = mainColor.CGColor;
// Disabled State
[self.sendFeedbackButton setBackgroundImage:[WTNUtility imageFromColor:[UIColor whiteColor]] forState:UIControlStateDisabled | UIControlStateHighlighted];
[self.sendFeedbackButton setTitle:NSLocalizedString(@"Feedback Form Send Feedback Button - Sending feedback disabled state", nil) forState:UIControlStateDisabled | UIControlStateHighlighted];
[self.sendFeedbackButton setTitleColor:mainColor forState:UIControlStateDisabled | UIControlStateHighlighted];
// Normal State
[self.sendFeedbackButton setBackgroundImage:[WTNUtility imageFromColor:mainColor] forState:UIControlStateNormal];
[self.sendFeedbackButton setTitle:NSLocalizedString(@"Feedback Form Send Feedback Button Title", nil) forState:UIControlStateNormal];
[self.sendFeedbackButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
}
-(void)shouldFeedbackButtonBeEnabled:(BOOL)decision {
BOOL currentState = self.sendFeedbackButton.enabled;
if (currentState == decision) {
return;
} else {
self.sendFeedbackButton.enabled = decision;
[self.sendFeedbackButton layoutIfNeeded];
}
}
-(void)sendFeedbackToParse {
DebugLog(@"%s",__PRETTY_FUNCTION__);
DebugLog(@"button is enabled: %@",self.sendFeedbackButton.enabled ? @"Yes" : @"No");
DebugLog(@"highlighted: %@",self.sendFeedbackButton.highlighted ? @"Yes" : @"No");
// sleep(10);
// self.sendFeedbackButton.enabled = YES;
}
您正在關於檢查主隊列的正確軌道,但您必須在UI有機會更新之前完成其他處理。
如果您的代碼對此方法很友好,請使用兩個調度塊返回主隊列。 第一個是您的UI狀態設置,第二個是您的剩余處理。 這使得UI狀態在您的其他處理完成之前實際更新。
偽代碼:
- (IBAction) handlePress:(id)sender {
dispatch_async(dispatch_get_main_queue(), ^{
// Do your state update (button disabled, etc)
});
dispatch_async(dispatch_get_main_queue(), ^{
// Do your further processing - AFTER the ui has been updated
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.