#objective-c #cocoa-touch #model-view-controller #uiview
#objective-c #cocoa-touch #модель-представление-контроллер #uiview
Вопрос:
У меня есть класс UIView, который я в настоящее время удаляю из своего представления, используя изнутри класса [self removeFromSuperview]
. Надеюсь, это правильно.
Однако теперь из моего контроллера представления (к которому я добавляю это представление) мне нужно знать, когда он был удален, чтобы я мог вызвать метод, когда это произойдет.
Ответ №1:
Вообще говоря, представление не должно выполнять такие действия, как удаление самого себя. Это работа контроллера представления.
Если UIView
подкласс может создавать события, требующие изменения иерархии представлений, я бы определил delegate
свойство для этого представления, и когда происходит событие, вызовите метод для этого делегата. Затем, когда ваш контроллер представления добавляет представление, он устанавливает себя в качестве делегата и определяет соответствующий метод для обработки события.
Ответ №2:
Если вы удалили UIView
view.removeFromSuperview()
вы можете проверить, существует ли он с помощью следующего кода:
if !(view.superview != nil) {
//no superview means not in the view hierarchy
}
Ответ №3:
У вас может быть обратный вызов делегата, устанавливающий контроллер в качестве делегата представления. Когда вы собираетесь удалить представление, выполните обратный вызов делегата и реализуйте метод обратного вызова в вашем контроллере.
‘removeFromSuperview’ всегда казался мне обратным … 🙁
Ответ №4:
Я предполагаю, что вы выполняете вызов удаления после какого-то действия, например, нажатия кнопки или чего-то еще. если это так, установите делегат кнопок в качестве контроллера представления, а не класса представления, и внутри метода action в контроллере представления вызовите
[yourCustomView removeFromSuperview];
Ответ №5:
Лучшим выбором было бы позволить контроллеру удалить представление
[self.view removeFromSuperview];
и чтобы узнать, был ли просмотр удален (или никогда не добавлялся), вы можете спросить
if(![self.view superview]) {
//no superview means not in the view hierarchy
}
Ответ №6:
Не уверен, какой sdk вы используете, но я использую iOS 5, и я просто использую следующий метод в супервизоре:
-(void)willRemoveSubview:(UIView *)subview{
if([subview isEqual:someView]){
//do stuff
}
//you could do some stuff here too
}
Комментарии:
1. Я должен также отметить, что я не использую файл конструктора интерфейса — и использую метод делегирования loadView для загрузки пользовательского подкласса UIView