Какой подобный метод функциональности (viewWillAppear) существует в UIView? - программирование
Подтвердить что ты не робот

Какой подобный метод функциональности (viewWillAppear) существует в UIView?

viewWillAppear вызывается в UIViewController, когда представление будет показано на экране. Возможно ли получить аналогичный обратный вызов в UIView?

4b9b3361

Ответ 1

Как насчет следующего из UIView справки

willMoveToSuperview:, didMoveToSuperview - применять эти методы по мере необходимости, чтобы отслеживать движение текущего представления в иерархии вашего представления.

это, по крайней мере, скажет вам, когда оно будет добавлено в иерархию представлений, но нет гарантии, что иерархия представления будет представлена ​​/доступна для просмотра.

Ответ 2

Нет, но вы можете перенаправить это уведомление на требуемый вид из вашего контроллера вида.

Ответ 3

  • Обратите внимание, что изначально я собирался опубликовать этот ответ здесь, но, учитывая, что об этом спрашивали за много лет до этого, я отметил его как дубликат и теперь отвечу здесь.

Макро-решение

Для этого я разработал макрорежим, который очень элегантен и прост в использовании.


.m

Добавьте следующее в ваш .m

-(void)viewDidLoad {
    //normal stuff
}

__METHOD_MACRO_wasRemovedFromSuperview() {
    //Code here will run whenever this view is removed from its superview
}

__METHOD_MACRO_wasAddedAsSubview() {
    //Code here will run whenever this view is added as the subview of another view
}

Да! Это действительно так просто!

(Из-за того, как переключение макроса ifdef настроено ниже, вы можете использовать один или другой, или оба!)


.h

Добавьте следующее в ваш .h под @end (или, если вы хотите сохранить вещи в чистоте, вы можете просто добавить файл с именем macros.h и #import его)

Примечание. Если вы добавите это (или импортируете) в несколько файлов, которые также импортируют друг друга или @class друг друга, вы можете в итоге испортить логику #ifdef, и этот макрос может не работать, я предлагаю импортировать его из отдельного файла .h для каждого класса, в котором вы нуждаетесь, этот макрос был создан скорее как доказательство концепции, чем как нечто, используемое в производственном коде

//Logic for __METHOD_MACRO_wasAddedAsSubview() and __METHOD_MACRO_wasRemovedFromSuperview()

#define startSuppressingWarnings() \
_Pragma("clang clang diagnostic push")\
_Pragma("clang diagnostic ignored \"-Weverything\"")

#define stopSuppressingWarnings() \
_Pragma("clang clang diagnostic pop")

#define __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup() \
-(void)didMoveToWindow {\
[super didMoveToWindow];\
if (self.window && self.superview) {\
startSuppressingWarnings()/*Hide potential undeclared selector warnings*/\
if ([self respondsToSelector:@selector(__wasAddedAsSubview)]) {\
[self performSelector:@selector(__wasAddedAsSubview)];\
}\
stopSuppressingWarnings()\
} else {\
startSuppressingWarnings()/*Hide potential undeclared selector warnings*/\
if ([self respondsToSelector:@selector(__wasRemovedFromSuperview)]) {\
[self performSelector:@selector(__wasRemovedFromSuperview)];\
}\
stopSuppressingWarnings()\
}\
}

#ifdef __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup
///Called when UIView was added as subview OR moved to another superview OR if another VC was presented
#define __METHOD_MACRO_wasAddedAsSubview() \
-(void)__wasAddedAsSubview/*{ //perform extra processes here }*/
#else
#define __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup 1
///Called when UIView was added as subview OR moved to another superview
#define __METHOD_MACRO_wasAddedAsSubview() \
__INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup() \
-(void)__wasAddedAsSubview/*{ //perform extra processes here }*/
#endif

#ifdef __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup
///Called when UIView is removed as subview from superview or when its parent window is removed
#define __METHOD_MACRO_wasRemovedFromSuperview() \
-(void)__wasRemovedFromSuperview/*{ //perform extra processes here }*/
#else
#define __INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup_wasSetup 1
///Called when UIView is removed as subview from superview
#define __METHOD_MACRO_wasRemovedFromSuperview() \
__INTERNAL_METHOD_MACRO__didChangeSuperviewsSetup() \
-(void)__wasRemovedFromSuperview/*{ //perform extra processes here }*/
#endif