UIButton
この 1 つのインスタンスのためだけにローダーを使用する代わりに、何かが起こっていることをユーザーに伝える方法として使用したいセットアップがあります 。
たとえば、次のようになりUIControlStateNormal
ます:
背景 緑
タイトル テキスト 白
タイトル - クリックして送信
背景
白
タイトル テキスト 緑タイトルUIControlStateDisabled
-
送信
次に、ボタンがクリックされると、ボタンを に更新しますenabled = NO;
。
問題
私が気付いた問題は、ボタンが無効 (有効 NO) に変更された場合、すべてのメソッド呼び出しなどが完了するまで、タイトル テキスト、色、背景の変更が完了しないため、遅すぎることです。
btn layoutIfNeeded
および/またはを使用するために他のスレッドを読みましたbtn setNeedsLayout
。これらは実際にボタンの更新を強制するものですが、他のすべての呼び出し/メソッドが完了するまで発生しないようです。したがって、ボタンのテキストなどを更新するには遅すぎます。
ボタンの状態と属性をすぐに更新し、他のタスクを完了する方法についてのアイデアはありますか? メインスレッドにあることを確認しましたが、すべての更新/呼び出しは問題ではありません。
EDIT
基本的に、ボタンがタップされると、状態を更新します。
- (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;
}