Проверьте, был ли просмотр удален или нет?

#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