удалить программно добавленный UIImageView

я делаю программу, которая имеет 2 кнопки в главном представлении;

один называется показать, а другой скрыть,

когда пользователь нажимает кнопку «Показать», на экран добавляется изображение.

код :

-(IBAction)show{
  UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 155, 155)];
  img.image = [UIImage imageNamed:@"icon.png"];
  [self.view addSubview:img];
}

и когда пользователь нажимает кнопку скрытия, я хочу, чтобы приложение скрывало только что добавленное изображение (img)

но...

когда я использую

-(IBAction)add{
  [img removeFromSuperView];
}

Xcode говорит «img Undecleared»

редактировать: Некоторые говорят, что определяют объект как общедоступный объект (@property), но проблема в том, что изображение добавляется только один раз. но я хотел, чтобы он добавлял новое изображение каждый раз, когда пользователь нажимает кнопку «Показать»,

поэтому я использовал метод [[self subviews]objectAtIndex:xx]removeFromSuperview] для решения проблемы.


person user1846654    schedule 12.12.2012    source источник
comment
Здесь вы получаете эту ошибку, потому что вы не определяете img для всего класса, здесь вы можете получить доступ к этой переменной в методе показа, потому что область действия этой переменной ограничена методом показа   -  person Paras Joshi    schedule 12.12.2012


Ответы (4)


Установите tag для просмотра изображения, и тогда вы сможете получить его по этому тегу.

[img setTag:123];

...

[[self.view viewWithTag:123] removeFromSuperview];
person Kjuly    schedule 12.12.2012
comment
/Users/PoriaX/Desktop/toMake/Classes/toMakeViewController.m:16:0 /Users/PoriaX/Desktop/toMake/Classes/toMakeViewController.m:16: предупреждение: «UIView» может не отвечать на «-removeFromSuperView» - person user1846654; 12.12.2012
comment
@ user1846654 о, это removeFromSuperview, а не removeFromSuperView. - person Kjuly; 12.12.2012
comment
FYI - Xcode 12, в 2021 году - это решение все еще работает, когда СКРЫТЫЙ переключатель на ДА волшебным образом перестает работать (у меня есть несколько контроллеров представления - работает в 1, не будет во 2-м). Еще раз спасибо, @Kjuly - person user3741598; 10.01.2021

Создайте объект UIImageView в файле .h, как показано ниже.

UIImageView *img;

и в методе .m файла viewDidLoad: просто добавьте его, как показано ниже.

- (void)viewDidLoad
{
    ///your another code
    img = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 155, 155)];
    img.image = [UIImage imageNamed:@"icon.png"];
    img.hidden = YES;
    [self.view addSubview:img];
}

и при нажатии кнопки показать показать изображение

-(IBAction)show{
    img.hidden = NO;
    [self.view bringSubviewToFront:img];
}

а для скрытия просто спрячьте, как ниже..

-(IBAction)add{
    img.hidden = YES;
}
person Paras Joshi    schedule 12.12.2012
comment
У Параса определенно все в порядке. Вы можете поместить UIImageView *img в { } после вашего интерфейса следующим образом: @interface ClassName { UIImageView *img; } или как свойство, подобное этому @property (strong, nonatomic) UIImageView *img;, и сослаться на img с помощью self.img. - person SirRupertIII; 13.12.2012
comment
@KKendall да, чувак, ты тоже прав, но я использую простой поток, потому что пользователь хочет скрыть и показать изображение только нажатием кнопки, в противном случае твоя логика тоже правильная, чувак ... Спасибо .. :) - person Paras Joshi; 13.12.2012
comment
Ах я вижу. Я просто не понял разницы между ними, я просто задал вопрос об этом здесь, на SO. - person SirRupertIII; 13.12.2012

Сделайте этот UIImageView членом вашего класса UIViewController.

person Andrey Chernukha    schedule 12.12.2012
comment
любой учебник по этому вопросу? - person user1846654; 12.12.2012

ваш объект img виден только в методе show, а не снаружи... вот почему. Заявите об этом снаружи, и ваша проблема будет решена.

person Pranjal Bikash Das    schedule 12.12.2012
comment
не устанавливайте его как @property или как глобальную переменную сразу после операторов #import. - person Pranjal Bikash Das; 13.12.2012