从另一个线程更改按钮图标/切换按钮

Posted

技术标签:

【中文标题】从另一个线程更改按钮图标/切换按钮【英文标题】:Changing button icon/toggling button from another thread 【发布时间】:2018-10-12 17:23:21 【问题描述】:

我正在尝试通过按下UITableViewCell 上的按钮在后台运行线程。

现在,我有一个方法,每次按下按钮时都会调用它,它会更改图标(从播放到暂停)并执行其他操作。

如果线程成功完成(尽管您可以使用单元格上的按钮将其停止),此按钮应从暂停图标转换回播放图标,以表明线程已正确完成。

我尝试在另一个线程中传递单元格本身,然后在dispatch_sync 中编辑单元格按钮。此处的xCode不会抛出任何错误,但按钮图标不会改变。

代码如下:

-(void)thread:(NSDictionary*)taskAssets
    @autoreleasepool 

        // Unpacking data
        TaskObject *taskData = taskAssets[@"taskData"];
        UILabel *statusLabel = taskAssets[@"statusLabel"];
        CustomTaskCell *cell = taskAssets[@"cell"];

        printf("Wow, this is the thread data: %s\n", [taskData.getTaskName UTF8String]);
        sleep(10);
        printf("Wow, the thread is done\n");
        dispatch_sync(dispatch_get_main_queue(), ^
            [cell setSelected:FALSE];
            [cell.button setImage:[UIImage imageNamed:@"playIcon"] forState:UIControlStateNormal];
            statusLabel.text = @"Status: Finished";

        );
    

有什么方法可以实现吗?

这是改变图标的​​地方(是的,发件人是按钮)

- (IBAction)runTask:(id)sender 
    if ([sender isSelected]) 
        [sender setImage:[UIImage imageNamed:@"playIcon"] forState:UIControlStateNormal];
        [sender setSelected:NO];
        [self updateStatus:@"Stopped"];
     else 
        [sender setImage:[UIImage imageNamed:@"pauseIcon"] forState:UIControlStateSelected];
        [sender setSelected:YES];
        [self updateStatus:@"Running..."];
        [self launchThread]; // This is where the thread starts...
    

【问题讨论】:

这段代码在哪里?显示一些上下文。而且您不应该直接更新单元格。更新您的模型,然后告诉表视图重新加载该索引路径处的行。 ?我使用这种精确的方法来更新单元格内的按钮图标(在这种情况下,我使用按钮操作本身来执行此操作)。不同之处在于更改按钮图标(以[cell.button setImage.... 开头)的那段代码在其他线程中不起作用。 【参考方案1】:

我可以看到您致电 [self launchThread];

发件人/单元格如何最终出现在您在 -(void)thread:(NSDictionary*)taskAssets

的字典中

我不完全了解@autoreleasepool 的作用,但也许您可以尝试以下方法:

-(void)thread:(NSDictionary*)taskAssets
    @autoreleasepool 
        // Unpacking data
        __block TaskObject *taskData = taskAssets[@"taskData"];
        __block UILabel *statusLabel = taskAssets[@"statusLabel"];
        __block CustomTaskCell *cell = taskAssets[@"cell"];

        printf("Wow, this is the thread data: %s\n", [taskData.getTaskName UTF8String]);
        sleep(10);
        printf("Wow, the thread is done\n");
        dispatch_sync(dispatch_get_main_queue(), ^
            [cell setSelected:FALSE];
            [cell.button setImage:[UIImage imageNamed:@"playIcon"] forState:UIControlStateNormal];
            statusLabel.text = @"Status: Finished";
        );
    

【讨论】:

以上是关于从另一个线程更改按钮图标/切换按钮的主要内容,如果未能解决你的问题,请参考以下文章

单击时Jquery向下滑动切换更改按钮文本和图标

引导折叠:更改切换按钮图标和文本的显示

按钮上的切换图标单击反应

更改按钮图标 SVG 颜色

使用浮动操作按钮更改图标颜色

根据按钮的属性值添加/删除 css 类