Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView上存在哪种类似的功能方法(ViewWillDisplay)?_Ios_Objective C_Uiview_Uikit_Viewwillappear - Fatal编程技术网

Ios UIView上存在哪种类似的功能方法(ViewWillDisplay)?

Ios UIView上存在哪种类似的功能方法(ViewWillDisplay)?,ios,objective-c,uiview,uikit,viewwillappear,Ios,Objective C,Uiview,Uikit,Viewwillappear,当视图即将显示在屏幕上时,将在UIViewController上调用ViewWillDisplay。是否可以在UIView上获得类似的回调?否,但您可以从视图控制器将该通知转发到所需的视图。参考中的以下内容如何 willMoveToSuperview:,didMoveToSuperview-根据需要实现这些方法,以跟踪视图层次结构中当前视图的移动 这至少会告诉您何时将其添加到视图层次,但不能保证视图层次是显示/可查看的 注意,我本来打算发布这个答案,但鉴于这是几年前提出的问题,我将该答案标记为

当视图即将显示在屏幕上时,将在UIViewController上调用ViewWillDisplay。是否可以在UIView上获得类似的回调?

否,但您可以从视图控制器将该通知转发到所需的视图。

参考中的以下内容如何

willMoveToSuperview:,didMoveToSuperview-根据需要实现这些方法,以跟踪视图层次结构中当前视图的移动

这至少会告诉您何时将其添加到视图层次,但不能保证视图层次是显示/可查看的

  • 注意,我本来打算发布这个答案,但鉴于这是几年前提出的问题,我将该答案标记为重复答案,现在将在这里回答
宏观解决方案 我已经为此制定了一个非常优雅且易于使用的宏解决方案


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 将以下内容添加到
@end
下的.h中(或者,如果您想保持整洁,只需将其添加到名为macros.h的文件中并#导入即可)

注意:如果将该宏添加(或导入)到多个文件中,这些文件也会相互导入或@class相互导入,那么最终可能会弄乱#ifdef逻辑,并且该宏可能会失败,我建议为每个需要该宏的类从单独的.h文件导入该宏,创建此宏更多地是为了证明概念,而不是为了在生产代码中使用


这是假设您有一个视图的控制器。@devios1最终每个视图都在一个视图控制器中,因此除非该视图具有私有访问权限,否则您可以在
视图中引用该视图,并调用
视图。MyOnViewWillAppearFunc()
。我认为
将移动(toWindow:)
/
didMoveToWindow()
是更接近的类比,因为在这些类比中,您可以测试窗口是否为
nil
,以查看视图是否属于附加到屏幕的层次结构的一部分。如果你正在设置定时器来控制动画或类似的东西,这可能就是你想要的。乔恩是对的。这还允许您检查视图何时出现在视图控制器转换之间,即使它没有在视图层次结构中移动?宏不好。
宏不好
听起来很主观。我这样做是为了好玩;这是一种让ViewWillDispear等价物清楚发生了什么的简洁方法,而不是
WillMoveToWindows{if(!window){if(!superview){/*stuff*/}}}
不那么清楚
//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