在 ViewController 中,ViewDidLoad
知道 VC 何时加载。
对于 UIView,加载视图时必须使用什么方法?
此方法会用任何初始化调用吗?
编辑:没有 XIB,只是以编程方式。
如果从XIB
文件加载它,加载完成后将调用awakeFromNib
方法:
override public func awakeFromNib() {
super.awakeFromNib();
// ... loading logic here ...
}
更新;在没有 XIB 的情况下,您可能必须使用文档的"观察视图相关更改"区域中的方法之一(例如,didMoveToSuperview
)来推断它。 但是,更好的方法是尽可能从视图控制器的viewDidLoad
方法向视图发送消息。
您可以使用 willMove(toSuperview newSuperview: UIView?)
import UIKit
final class myView: UIView {
override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
//Do stuff here
}
}
苹果文档
实际上,对于视图的初始化,您不必对视图控制器的方法 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...
}
我想,这就是你需要的。
干杯!
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.
}
}
我有类似的问题,并找到了相对简单的解决方案。想法是在正确的时间将 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");
}
据我所知,我认为除了 init 之外没有这样的方法。通常我在 init 方法中进行准备。您可以创建自己的viewDidLoad
方法并手动调用它。但大多数时候,UIView 由它的视图控制器管理,因此视图控制器应该知道何时加载视图,如果要配置视图,可以在视图控制器中进行。顺便说一下,并不总是调用 viewDidLoad
方法。
它不像这样工作。
加载视图控制器时不调用- (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 Do Load 是一种单独的方法,因此您不必中断实际的 loadView 方法和复杂的视图加载选项。当开发人员不确定 Apple 在做什么以及他们的最佳实践是什么时,使用 nib 等时,子类化和覆盖 loadView 方法可能会导致问题,因此 Apple 将该方法分离出来是明智的。
然后,当出现内存警告时,视图将释放,并设置为 nil:
- (void)viewWillUnload;
// view unloaded and set to nil.
- (void)viewDidUnload;