супервизор и подпросмотр ios

#ios #subview #superview

#iOS #подпросмотр #супервизор

Вопрос:

У меня есть супервизор, и я добавляю вложенный просмотр, чтобы сделать выбор. В супервизоре (основной вид) Я делаю следующее: [self.view добавляет подпросмотр:cityViewController.view];

В cityView, когда я сделал то, что мне нужно, я просто выполняю self.view removeFromSuperview.

Вопрос в том, как я могу определить, когда подпросмотр удалился изнутри супервизора.

Ответ №1:

Есть несколько способов, но, честно говоря, поскольку текущий контроллер представления (назовем его main) просто добавляет представление cityViewController , продолжайте обработку добавления / удаления представлений в текущий контроллер представления и просто вызывайте главный контроллер [cityViewController.view removeFromSuperView]

Таким образом, вы можете выполнить любой код, который вы хотите, когда он получит это уведомление (будь то запускающий метод или UINotification ).

— отредактируйте пример кода UINotification —

main.m

 ...
//Define cityViewController as an iVar and alloc/init it
[[UINotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishView:) name:@"DidFinishView" object:nil];
[self.view addSubview:cityViewController.view];
...

-(void) didFinishView:(NSNotification *)notification {
    [cityViewController.view removeFromSuperView];
}
  

CityViewController.m

 -(IBAction) doneButtonClick:(id) sender {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"DidFinishView" object:nil];
}
  

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

1. но как мне обработать событие в родительском представлении, возникающее в результате события в cityview

2. Опять же, есть несколько способов сделать это. Один из самых простых — использовать UINotification. Я добавлю код к своему ответу, чтобы продемонстрировать.

Ответ №2:

Быстрый ответ заключается в том, что ваш вид не должен удаляться сам по себе. Для представления лучше передавать пользовательские взаимодействия соответствующему контроллеру через механизм межобъектной связи. Наиболее распространенными методами являются прямые сообщения, протоколы и уведомления. Платформа iOS использует все это, и есть отличные документы, объясняющие их. Вот краткое резюме:

  • Прямой обмен сообщениями. Используйте это, когда объекту необходимо установить связь с определенным объектом известного типа. Например, если MyView всегда содержится в MyViewController и ему необходимо отправлять сообщения, вы можете добавить свойство к MyView классу, которое хранит указатель на конкретный MyViewController объект. Затем вы можете отправить сообщение от myView к нему myViewController через [myView.myViewController userDidTapSaveButton] или что-то еще.

  • Протоколы. Протокол определяет контракт между объектами, которые ничего не знают друг о друге, кроме того, что они соблюдают контракт. Например, UITableView знает, что его делегат соответствует UITableViewDelegate протоколу, и он может отправлять требуемые сообщения протокола своему делегату. Любой объект может соответствовать UITableViewDelegate протоколу.

  • Уведомления. Уведомления позволяют объекту отправлять уведомления через центральный механизм ( NSNotificationCenter ), который другие объекты могут наблюдать и реагировать на него. Уведомления полезны, когда объект, отправляющий уведомление, не знает или ему все равно, какие объекты наблюдают за его уведомлениями.

Я бы прочитал соответствующие документы и другие вопросы и ответы на SO об этих методах. Я бы также немного изучил шаблон проектирования MVC (модель / вид / контроллер), чтобы вам было удобнее знать, куда помещать логику приложения. Как правило, представление должно отвечать только за его отображение (на основе свойств, установленных его контроллером), наблюдение / реагирование на действия пользователя и уведомление своего контроллера о соответствующих действиях.