1

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;
}
4

1 に答える 1