用于UIView的iOS viewDidLoad

man*_*urt 58 uiviewcontroller uiview ios

在ViewController中,ViewDidLoad可以知道VC何时加载.

对于UIView,在加载视图时我必须使用什么方法?

是否可以使用任何init调用此方法?

编辑:没有XIB,只是以编程方式.

bor*_*den 46

如果从XIB文件加载它,则从XIB加载awakeFromNib方法时将调用它.

编辑在没有XIB的情况下,您可能必须使用文档Observing View-Related Changes区域中一种方法来推断它(例如,didMoveToSuperview).但是,更好的方法是在viewDidLoad方法中从视图控制器向视图发送消息.


ake*_*lec 7

实际上,对于视图的初始化,您不必对视图控制器的方法viewDidLoad()执行任何操作.您想要做的就是,您可以在视图的init方法中执行.例如,在视图控制器的viewDidLoad()中,有一些初始化代码:

- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}
Run Code Online (Sandbox Code Playgroud)

类似地,在您的视图的init方法中:

- (id)initWithDelegate:(id)_delegate
{
    self = [[[[NSBundle mainBundle] loadNibNamed:@"YourView" owner:self options:nil] objectAtIndex:0] retain];
    if (self) {
        [super init];

        self.delegate = _delegate;

        // init your parameters here

        return self;

    }
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

然后,您从视图控制器创建YourView,如下所示:

YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];
Run Code Online (Sandbox Code Playgroud)

此外,您在视图加载时要执行的操作,可以在视图中放置layoutSubviews方法,如下所示:

-(void)layoutSubviews{
    [super layoutSubviews];

    // init your parameters here, like set up fonts, colors, etc...
}
Run Code Online (Sandbox Code Playgroud)

我想,这就是你所需要的.

干杯!


fat*_*han 7

斯威夫特2:

import UIKit

class myView: UIView {

  override func layoutSubviews() {
    print("run when UIView appears on screen")
    // you can update your label's text or etc.
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 警告:layoutSubviews可以多次触发,当然不是做任何设置代码的地方(例如viewDidLoad) (14认同)

dav*_*ynn 6

您可以使用willMove(toSuperview newSuperview:UIView?)

import UIKit

final class myView: UIView {

  override func willMove(toSuperview newSuperview: UIView?) {
     super.willMove(toSuperview: newSuperview)
     //Do stuff here
   }

} 
Run Code Online (Sandbox Code Playgroud)

苹果文件