67

在 ViewController 中,ViewDidLoad需要知道 VC 何时加载。

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

这个方法会被任何init调用吗?

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

4

7 回答 7

56

如果从XIB文件中加载它,则awakeFromNib加载完成后将调用该方法:

override public func awakeFromNib() {
    super.awakeFromNib();

    // ... loading logic here ...
}

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

于 2012-04-16T01:26:38.090 回答
14

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

import UIKit

final class myView: UIView {

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

} 

苹果文档

于 2018-01-31T19:49:17.537 回答
7

实际上,对于视图的初始化,您不必对视图控制器的方法 viewDidLoad() 做任何事情。所有你想做的,你都可以在视图的 init 方法中做。例如,在视图控制器的 viewDidLoad() 中,有一些初始化代码:

- (void)viewDidLoad{
    [super viewDidLoad];

    // init your parameters here
}

类似地,在您的视图的 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;
}

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

YourView view = [[YourView alloc] initWithDelegate:self];
[self.view addSubview:view];
[view release];

此外,当您的视图加载时您想要做的事情,您可以放置​​在您的视图中的 layoutSubviews 方法中,如下所示:

-(void)layoutSubviews{
    [super layoutSubviews];

    // init your parameters here, like set up fonts, colors, etc...
}

我想,这就是你需要的。

干杯!

于 2014-06-04T06:54:51.560 回答
5

斯威夫特 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.
  }
}
于 2016-03-10T17:54:43.247 回答
2

我有类似的问题,并找到了相对简单的解决方案。想法是在正确的时间将 viewDidLoad 发送到每个子视图,并在您感兴趣的类上重载该方法。

为此,请在您的类中添加这部分代码...

//  UIViewController
- (void)viewDidLoad
{

    [super viewDidLoad];

    [self.view viewDidLoad];
}


//  UIView+Loading.m
#import < UIKit/UIKit.h>

@implementation UIView (Loading)

- (void)viewDidLoad
{

    for (UIView* subview in self.subviews)

        [subview viewDidLoad];
}

@end


//  UIView+Loading.h
#import < UIKit/UIKit.h>

@interface UIView (Loading)

- (void)viewDidLoad;

@end


// UIView_CustomImplementation

- (void)viewDidLoad
{

    NSLog(@"Do whatever you want to do in custom UIView after method viewDidLoad on UIViewController was called");

}
于 2013-02-21T18:23:26.013 回答
0

据我所知,我认为除了init之外没有这样的方法。通常我在init方法中做准备。您可以创建自己的viewDidLoad方法并手动调用它。但大多数时候,UIView 是由它的视图控制器管理的,因此视图控制器应该知道视图何时加载,如果要配置视图,可以在视图控制器中进行。顺便说一句,该viewDidLoad方法并不总是被调用。

于 2012-04-16T01:36:20.173 回答
-6

它不太像这样工作。

- (void)viewDidLoad加载视图控制器时不调用;它在视图控制器的视图被加载时被调用。

因此,您可以创建 UIViewController,唯一会调用的方法是用于初始化它的 init 方法。不会创建视图,不会调用 -(void)viewDidLoad 方法等。

然后当其他东西通过以下方式向视图控制器询问其视图时:

viewController.view;

然后视图控制器调用:

- (void)loadView; // This is where you put your own loading view information, and set the viewController's self.view property here.

其次是:

- (void)viewDidLoad;

View Did Load 是一个单独的方法,因此您不必中断实际的 loadView 方法和复杂的视图加载选项。当开发人员不确定 Apple 在做什么以及他们的最佳实践是什么时,在使用 nib 等时子类化和覆盖 loadView 方法可能会导致问题,因此 Apple 将方法分离出来是明智的。

然后,当出现内存警告时,视图被释放,并设置为 nil:

- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
于 2012-04-16T01:28:59.633 回答