#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 (модель / вид / контроллер), чтобы вам было удобнее знать, куда помещать логику приложения. Как правило, представление должно отвечать только за его отображение (на основе свойств, установленных его контроллером), наблюдение / реагирование на действия пользователя и уведомление своего контроллера о соответствующих действиях.