在ViewController中,有ViewDidLoad
知道VC加载的时间。
对于UIView,在加载视图时我必须使用哪种方法?
是否可以使用任何init调用此方法?
编辑: 没有XIB,只是以编程方式。
答案 0 :(得分:40)
如果从XIB文件加载它,则从XIB加载时将调用awakeFromNib方法。
编辑如果没有XIB,您可能需要使用{{3>}的观察视图相关更改区域中的一种方法来推断它(例如,didMoveToSuperview)。但是,更好的方法是在viewDidLoad方法中从视图控制器向视图发送消息。
答案 1 :(得分:7)
Actualy,对于视图的初始化,您不必对视图控制器的方法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...
}
我想,这就是你需要的。
干杯!
答案 2 :(得分:6)
Swift 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.
}
}
答案 3 :(得分:3)
您可以使用willMove(toSuperview newSuperview:UIView?)
import UIKit
final class myView: UIView {
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
//Do stuff here
}
}
答案 4 :(得分: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");
}
答案 5 :(得分:-1)
据我所知,除了init之外,我认为没有这样的方法。通常我会在init方法中做准备。您可以创建自己的viewDidLoad
方法并手动调用它。但大部分时间,UIView由它的视图控制器管理,因此视图控制器应该知道何时加载视图,如果要配置视图,则可以在视图控制器中进行。顺便说一下,并不总是调用viewDidLoad
方法。
答案 6 :(得分:-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方法和复杂的视图加载选项。在使用nibs等时对子类进行子类化和重写可能会导致开发人员不确定Apple正在做什么以及他们的最佳实践是什么时出现问题,因此Apple很聪明地将该方法分离出来。
然后,当一个内存警告到来时,视图被释放,并设置为nil:
- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;