2

UIButton の有効化/無効化に問題があります。後でコードで再度有効にしないと、ボタンを無効にしても問題なく動作します。後で有効にすると、無効になっているように表示されますが (不透明度が変化します)、それを押すと、添付された IBAction 関数がまだ呼び出されます。

コード:

- (void)loadDataFromURL:(NSURL *)URL withLoadIndicator:(UIActivityIndicatorView *)loadIndicator errorName:(NSString *)name sender:(id)sender andCallback:(SEL)selector{

    // Start loading indicator, block button so we will have only one call at a time
    [loadIndicator startAnimating];

    if ([sender isKindOfClass:[UIButton class]]) {
        UIButton *button = sender;
        [button setEnabled:NO];
    }

    // Run the data load sequence
    self.dispatchQueue = dispatch_queue_create("com.companyname.settingsqueue", 0);

    dispatch_async(self.dispatchQueue, ^{
        // Downloading JSON and using CoreData to put it into the sqlite database here
    });

    // After loading is complete stop animating and re-enable the button
    dispatch_async(dispatchQueue, ^{
        [loadIndicator stopAnimating];
        if ([sender isKindOfClass:[UIButton class]]) {
            UIButton *button = sender;
            button.enabled = YES;
        }
    });
}

奇妙なことに、それは loadIndicator に対して完全に機能します。関数の送信者パラメーターから取得したボタンは存在します (null ではありません)。削除 button.enabled = YES;しても、本来は無効のままです。非同期実行中にボタンがまだ有効になっていない状態で、非同期コードが実行された後に再度有効にする方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

2

徹底的に検索した結果、問題の答えが見つかりました。メインスレッドですべてのUIView関数を実行していなかったため、関数が終了してもUIが更新されませんでした。そのため、オーバーレイしているUIViewとUIActivityIndi​​catorがまだ画面から削除されていなくても、ボタンは非常に短時間無効になり、その後再び有効になりました。

これが同様の問題を抱えている他の誰かに役立つことを願っています。

于 2012-09-30T15:03:44.297 に答える