UIView - 如何在视图加载时收到通知?

83

是否有类似于UIViewControllerviewDidLoad方法,适用于UIView? 我需要在UIView加载后(UIView的子类),立即得到通知并执行一些操作。

1个回答

277

根据需要执行的操作不同,可以使用以下几种技术:

  1. -(id)initWithFrame:(CGRect)frame - UIView的指定初始化方法;除非从nib文件中加载视图,否则始终会发送给UIView进行初始化;
  2. -(id)initWithCoder:(NSCoder *)coder - 无论何时从nib文件中加载视图,都会发送此方法进行初始化;
  3. -(void)awakeFromNib - 在nib文件中的所有对象都初始化并连接之后发送;仅当从nib文件中加载对象时才适用;必须调用super方法;
  4. -(void)willMoveToSuperview:(UIView *)newSuperview - 在将视图添加为另一个视图的子视图之前立即发送;如果从其父视图中移除视图,则newSuperview可能为nil;
  5. -(void)willMoveToWindow:(UIWindow *)newWindow - 在视图(或其父视图)被添加到窗口之前立即发送;如果从窗口中移除视图,则newWindow可能为nil;
  6. -(void)didMoveToSuperview - 视图插入视图层次结构后立即发送;
  7. -(void)didMoveToWindow - 视图获得其window属性设置后立即发送。-

基本上,您可以选择在初始化期间执行操作(1和2),从nib文件中加载后执行(3),在插入到视图层次结构之前(4和5)以及此后(6和7)执行操作。


非常感谢您的完美答案(非常详细)。我正在修改一个分段控件,但它没有显示更改,因为我在init期间调用了修改方法,我将其移动到didMoveToWindow中,解决了所有问题。 - aryaxt
1
在视图控制器的viewDidLoad之前似乎发生了所有这些事情。 - Alex Chan
3
-(void)willMoveToSuperview:(UIView *)newSuperview 是解决我所有问题的方法,非常感谢! - Erion S
我又忘记了,在初始化过程的最开始调用某些东西是行不通的,必须在7中执行或者从那里延迟执行才能正常工作! :) - Alex Cio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接