objective-c - UIButton 禁用后仍然调用 IBAction

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

预先感谢您对我的帮助。

最佳答案

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

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

关于objective-c - UIButton 禁用后仍然调用 IBAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11327825/

相关文章:

iphone - 当按钮位于UITableViewCell上时,UIButton为什么showTouchWhenHighlighted不起作用?

Swift UIControlState.Selected 保持选中状态吗?

swift - 子类化 NSControl,IBAction 在 Swift 中不被调用

ios - 保存自己的数据类型时使用 NSUserDefaults

objective-c - 多个 NSTimers 问题

iphone - 在 iphone 中将此 Html 文本转换为简单文本

objective-c - UITextView 更新阻塞

ios - 一秒钟后 UIButton 退出突出显示模式

ios - 沿圆圈移动按钮

ios - 自定义键盘的 "Next"和 "Done"返回按钮