从另一个线程更改按钮图标/切换按钮
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";
);
【讨论】:
以上是关于从另一个线程更改按钮图标/切换按钮的主要内容,如果未能解决你的问题,请参考以下文章