#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), а логика контроллера должна быть в контроллере, к которому вы добавляете вложенные представления. Это был бы самый распространенный шаблон проектирования.