UIButton在禁用后仍然会调用IBAction

时间:2012-07-04 11:04:46

标签: objective-c uibutton ibaction

我在启用/禁用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。我从函数中的sender参数获得的按钮确实存在(它不是null)。当我删除button.enabled = YES;时,它会保持禁用状态。有没有办法在异步代码执行后再次启用它,而在异步执行期间仍未启用按钮?

先谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

经过广泛搜索后,我找到了问题的答案。因为我没有在主线程上运行我的所有UIView函数,所以即使我的函数完成,UI也没有更新。因此,即使我的覆盖UIView和UIActivityIndi​​cator尚未从屏幕上删除,按钮也会在很短的时间内被禁用然后再次启用。

我希望这可以帮助其他有类似问题的人。