2016-05-17 3 views
1

Я пытаюсь удалить изображение из существующего вида, используя код ниже:removeFromSuperview UIImageView не работает

-(void) deleteImage:(int)imageID{ 

//[self.imageArray removeObjectAtIndex:imageID]; 
//remove the image from the screen 
for (UIView* view in self.view.subviews) { 
    if ([view isKindOfClass:[UIImageView class]] && [view tag] == imageID) { 
     //could be a bug here with the re-Ordering of the array (could add a helper method to reset all the tags on screen when this is called 
     NSLog(@"view %@", view); 
     //[self.imageArray removeObjectAtIndex:imageID]; 
     [view removeFromSuperview]; 
    } 
    } 
} 

NSLog выводит следующее:

view <UIImageView: 0x18b8d7b0; frame = (0 0; 768 2016); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x18b8d890>> 

Проблема, которую я имею, что оно похоже, получает ImageView, но не удаляет его.

+0

не могли бы вы рассказать о требовании. Вам действительно нужно удалить сам «imageView» или просто очистить изображение, отображаемое «imageView»? – GoGreen

+0

@GoGreen Мне нужно удалить сам imageView – jampez77

+0

, вы записали заявление перед удалением его из супервизора. Попробуйте выполнить цикл через subviews после инструкции for, чтобы проверить, присутствует ли 'imageView'. Кроме того, это не идеальный способ удаления subviews. Сохраните ссылку на представление, которое хотите удалить, добавив его как переменную 'property' или' instance. Затем вы можете удалить его, используя эту ссылку. Пожалуйста, проверьте еще раз. – GoGreen

ответ

1

Поскольку вы пытаетесь изменить пользовательский интерфейс, вы должны делать это в основном потоке. Поэтому, сделайте следующее:

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

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

Во-вторых, в принципе вы должны получить сбой при попытке удалить подвью, потому что вы используете быстрое перечисление, которое запрещает мутирование коллекции во время перечисления.

Наконец, правильным методом удаления подсмотра представления является использование метода removeFromSuperview, что подразумевает, что вам необходимо сохранить ссылку на рассматриваемый образ.

По существу, вы должны использовать методы, предусмотренные в разделе UIView под названием «Управление иерархией представлений», а не для того, чтобы обманывать себя с помощью самих массивов subview. Это рецепт потенциального попадания иерархии subviews в несогласованное состояние.

Смежные вопросы