Удалить из супервизора

#iphone #objective-c #xcode

#iPhone #objective-c #xcode

Вопрос:

Просто небольшой вопрос, с которым у меня действительно много проблем

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

Вот код

Это выводит изображение на экран

 - (IBAction)pushBn:(id)sender {


    ZeldaView *newZelda = [[ZeldaView alloc]initWithNibName:@"ZeldaView" bundle:nil];

    theZeldaView=newZelda;
    [self.view insertSubview:theZeldaView.view atIndex:1];

}
  

это удаляет его, когда я касаюсь его

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{


    UITouch *touch =[touches anyObject];
    CGPoint location=[touch locationInView:theZeldaView.view];

    if (CGRectContainsPoint(theZeldaView.theImage.frame, location)) {

        [theZeldaView.view removeFromSuperview];

    }

}
  

Ответ №1:

Конечно, просто выполните итерацию по дочерним элементам вашего родительского представления (self.view) и удалите все, которые являются элементами ZeldaView.

Проще всего это было бы что-то вроде:

 for (UIView* subView in [self.view.subviews])
{
    if ([subView isKindOfClass:[ZeldaView class]])
        [subView removeFromSuperview];
}
  

Хотя вы, вероятно, захотите подробнее остановиться на этом, чтобы не выполнять фактическое удаление во время итерации, и вы можете захотеть использовать responsestoselector и пользовательский метод вместо проверки класса здесь, чтобы вы могли выполнить любую необходимую очистку из класса ZeldaView. Надеюсь, это имеет смысл для вас.

Ответ №2:

конечно, есть много способов сделать это. Я бы сохранил массив ZeldaView объектов, и когда вы захотите их удалить, пройдите по массиву и удалите их все.

в вашем .h:

 @property (nonatomic, retain) NSMutableArray *zeldaViews;
  

при добавлении ZeldaView:

 // create a newZeldaView and add it to the superview
[self.zeldaViews addObject:newZeldaView];
  

когда вы хотите удалить их все:

 for (ZeldaView *zeldaView in self.zeldaViews) {
    [zeldaView.view removeFromSuperview];
}
[self.zeldaViews removeAllObjects];
  

создайте изменяемый массив в viewDidLoad и освободите его в viewDidUnload и dealloc. Измените как approp, если вы используете ARC.

Комментарии:

1. по какой-то причине он все еще не удаляет представление

2. если вы скопировали мой код дословно, у меня была ошибка. Я не заметил, что zeldaView это контроллер с именем. основываясь на вашем исходном коде, вам нужно удалить представления в цикле с помощью [zeldaView.view removeFromSuperview] . Помимо этого, вам придется опубликовать свой новый код.

3. в любом случае, если вы помещаете виды, которые вы добавляете в основной вид, в массив, а затем удаляете их из супервизора путем перебора массива, это сработает. если это не так, значит, в вашем коде что-то еще не так.

4. Логически это имеет наибольшее значение, но по какой-то причине у меня возникли проблемы с его реализацией, поэтому я решил обойти это, вот что я сделал, я создал новый контроллер просмотра для создания imageview в каждый раз, когда я нажимаю свою кнопку, я создаю другое изображение, а затем просто удаляю этот контроллер просмотра из супервизора

5. реализация вашего приложения вызывает подозрение. как правило, вы не создаете новый контроллер только для того, чтобы добавить представление в супервизор. например, вы не создаете UIButtonController для добавления UIButton. Мне кажется, что ZeldaView должен быть подклассом UIView (не UIViewController), а логика контроллера должна быть в контроллере, к которому вы добавляете вложенные представления. Это был бы самый распространенный шаблон проектирования.