UIView - как получить уведомление, когда представление загружено?


79

Есть что-нибудь похожее на the viewDidLoadof UIViewControllerfor a UIView??? Мне нужно получить уведомление, как только UIViewзагрузится (подкласс UIView), и выполнить некоторые действия.

Ответы:


268

В зависимости от того, какие действия вам нужно выполнить, существует несколько приемов:

  1. -(id)initWithFrame:(CGRect)frame- назначенный инициализатор UIView; всегда отправляется в UIView для его инициализации, если только представление не загружается из пера;
  2. -(id)initWithCoder:(NSCoder *)coder - всегда отправляется для инициализации UIView всякий раз, когда представление загружается из пера;
  3. -(void)awakeFromNib- отправляется после того, как все объекты в пике инициализированы и подключены; применимо, только если вы загружаете объект из пера; вы должны позвонить супер;
  4. -(void)willMoveToSuperview:(UIView *)newSuperview- отправляется непосредственно перед добавлением представления в качестве подпредставления к другому представлению; newSuperviewможет быть нулевым, когда вы удаляете представление из его супервизора;
  5. -(void)willMoveToWindow:(UIWindow *)newWindow- отправляется непосредственно перед добавлением представления (или его супервизора) в окно; newWindowможет быть нулевым, когда вы убираете вид из окна;
  6. -(void)didMoveToSuperview - отправляется сразу после того, как представление вставлено в иерархию представлений;
  7. -(void)didMoveToWindow- отправляется сразу после того, как представление получает набор свойств окна. -

В принципе, вы можете выполнять свои действия во время инициализации (1 и 2), после загрузки из пера (3), перед вставкой в ​​иерархию представлений (4 и 5) и после этого (6 и 7).


Большое спасибо, отличный ответ (очень подробный). Я изменял сегментированный элемент управления, и он не отображал изменения, потому что я вызывал метод модификации во время инициализации, я переместил его в didMoveToWindow, и он устранил все проблемы
aryaxt

1
Кажется, все это произошло до viewDidLoad в viewController
Alex Chan

3
-(void)willMoveToSuperview:(UIView *)newSuperviewбыло лекарством от всех моих проблем, большое вам спасибо!
Erion S

Я снова забыл, что некоторые вещи не работают, если вы продолжаете вызывать их внутри UIView в самом начале процесса инициализации ... Так что выполнение этого в 7 или выполнение с задержкой оттуда всегда будет работать! :)
Alex Cio
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.