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

问题描述 投票:2回答:1

我试图通过按下放在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...
    }
}
ios objective-c uitableview
1个回答
-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";
        });
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.