适用于UIVi的iOS viewDidLoad

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

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

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

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

manuelBetancurt asked 2019-11-07T21:01:35Z
7个解决方案
45 votes

如果从XIB文件加载,则从XIB加载awakeFromNib方法将被调用。

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

borrrden answered 2019-11-07T21:01:58Z
7 votes

实际上,对于视图的初始化,您不必对视图控制器的方法viewDidLoad()进行任何操作。 您要做的所有事情,都可以在view的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...
}

我认为,这就是您所需要的。

干杯!

akelec answered 2019-11-07T21:02:49Z
7 votes

斯威夫特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.
  }
}
fatihyildizhan answered 2019-11-07T21:03:08Z
6 votes

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

import UIKit

final class myView: UIView {

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

} 

苹果文件

davidrynn answered 2019-11-07T21:03:38Z
2 votes

我有类似的问题,并找到了相对简单的解决方案。 想法是在适当的时候将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");

}
vedrano answered 2019-11-07T21:04:08Z
-1 votes

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

Tranz answered 2019-11-07T21:04:32Z
-6 votes

这样不是很有效。

加载视图控制器时未调用- (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方法和复杂的视图加载选项。 当开发人员不确定苹果在做什么以及他们的最佳实践是什么时,使用笔尖等子类化并覆盖loadView方法可能会导致问题,因此,苹果将方法分开很明智。

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

- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;
thebarcodeproject answered 2019-11-07T21:05:38Z
translate from https://stackoverflow.com:/questions/10167706/ios-viewdidload-for-uiview