Подтвердить что ты не робот

RemoveFromSuperview не работает

Мне нужно убрать кнопку из представления и добавить другую. Мой код выглядит следующим образом:

-(void)UpdatePromoBanner:(NSString*)value{
    [button setTitle:@"newer text" forState:UIControlStateNormal];
    for (UIView *subView in emptyViewController.view.subviews)
    {
        if(subView.tag == 99) {
            //--remove button and add an updated one
            NSLog(@"Remove button?");
            [subView removeFromSuperview];
            //[subView.superview addSubview:button];
        }
    }
    NSLog(@"event called");

}

-(void)AddPromoBannerToBottom:(UIView*)view {

    button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button addTarget:self 
               action:@selector(aMethod:)
     forControlEvents:UIControlEventTouchDown];
    [button setTitle:lblForBannerButton forState:UIControlStateNormal];
    button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
    button.tag = 99;

    [view addSubview:button];
}

EmptyViewController - это просто пустой пульт управления представлением. Я добавляю кнопку посередине. Я ударил NSLog ok, который проверяет тег, но представление не удаляется. Должен упомянуть, что я использую поток, который запускает updatepromobanner каждые 5 секунд.

4b9b3361

Ответ 1

Оскар прав. Вы должны обновить интерфейс в основном потоке. Понял, что я добавлю код, чтобы помочь.

Заменить:

[subView removeFromSuperview];

С помощью:

[subView performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO];

И я думаю, вам должно быть хорошо идти, ничего не меняя.

Ответ 2

Вы не можете обновлять пользовательский интерфейс, используя дополнительный поток, каждый раз, когда ваш поток выполняет обновления пользовательского интерфейса, вы должны вызывать основной поток.

Ответ 3

dispatch_async(dispatch_get_main_queue(), ^{
         [subView removeFromSuperview];
});

Помните обновление интерфейса в основном потоке:)