Смена значка кнопки / переключение кнопки из другого потока - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь запустить поток в фоновом режиме, нажимая кнопку, расположенную на 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...
    }
}

1 Ответ

0 голосов
/ 13 октября 2018

Я вижу ваш звонок на
[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";
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...