大家好,又见面了,我是全栈君 awakeFromNib 在使用IB的时候才会涉及到此方法的使用。 当.nib文件被载入的时候,会发送一个awakeFromNib的消息到.nib文件里的每一个对象,每一个对象都能够定义自己的awakeFromNib函数来响应这个消息。运行一些必要的操作。 结果如图: 第一句:通过Xcode实例化controller,但controller的类在IB中创建时调用此方法 {我看有这么说的 awakeFromNib是一个仅仅有在GUI对象被成功载入才调用的方法 当程序对Nib文件进行反序列化然后初始化时,会调用一次awakeFromNib。 可是假设你使用initWithNibName调入Nib时,awakeFromNib是不会被调用的。 这个我能够理解,但为什么是两句有点不理解,请高手不吝赐教 第四句:这句就是awakeFromNib被调用的地方了。
我的思路是这样的,通过Xib创建的视图在初始化的时候都会调用awakeFromNib方法,通过交换方法,实现为Xib适配字体。 + (void)load { Method swizeeMethod = class_getInstanceMethod([UILabel class], @selector(d_awakeFromNib )); Method originalMethod = class_getInstanceMethod([UILabel class], @selector(awakeFromNib)); method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } } - (void)d_awakeFromNib fontWithDescriptor:self.font.fontDescriptor size:self.font.pointSize * scaleSize]; [self d_awakeFromNib
XibScale) + (void)load { Method swizeeMethod = class_getInstanceMethod([UILabel class], @selector(d_awakeFromNib )); Method originalMethod = class_getInstanceMethod([UILabel class], @selector(awakeFromNib)); class_addMethod([UILabel class], @selector(awakeFromNib), method_getImplementation(swizeeMethod), method_getTypeEncoding method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } } - (void)d_awakeFromNib self.font.fontDescriptor size:self.font.pointSize * [FitScaleHelper getScaleSize]]; [self d_awakeFromNib
CGRect)frame{ self = [super initWithFrame:frame]; [self loadView]; return self; } -(void)awakeFromNib { [super awakeFromNib]; [self loadView]; } -(void)layoutSubviews{ [super layoutSubviews] (coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func awakeFromNib () { super.awakeFromNib() self.loadView() } override func layoutSubviews override func awakeFromNib() { super.awakeFromNib() } } ZJUserPicView.xib的File's Owner
super initWithCoder:aDecoder]; NSLog(@"%s", __func__); return self; } -(void)awakeFromNib { [super awakeFromNib]; NSLog(@"%s", __func__); } -(void)layoutSubviews{ super initWithCoder:aDecoder]; NSLog(@"%s", __func__); return self; } -(void)awakeFromNib { NSLog(@"%s", __func__); [super awakeFromNib]; } @end 结论总结 如果控制器是直接通过代码创建出来的,并且调用方法为 YFViewController viewDidAppear:] 如果是通过SB创建控制器,那么VC的生命周期为: -[ViewController initWithCoder:] -[ViewController awakeFromNib
self = [super initWithCoder:aDecoder]) { } NSLog(@"%s",__func__); return self; } - (void)awakeFromNib { [super awakeFromNib]; NSLog(@"%s",__func__); } @end 通过init方法初始化自定义控件 @implementation ViewController ,如果要通过代码修改xib的内容,一般建议放在awakeFromNib方法内 控件封装 一般封装一个控件,为了让开发者方便使用,通常会在自定义的控件中编写俩个方法初始化方法,这样不管是通过init还是加载 if (self = [super initWithFrame:frame]) { [self setup]; } return self; } - (void)awakeFromNib { [super awakeFromNib]; [self setup]; } - (void)setup{ [self setBackgroundColor:[UIColor
{ [super awakeFromNib]; NSLog(@"FirstVC awakeFromNib"); } 请注意:为了保证代码顺利执行,且保证模拟器顺利加载ViewController 我试过去掉所有的[super viewxxxx]代码,控制台打印如下 2016-03-24 10:31:28.328 SIMAlbum[33599:524075] FirstVC awakeFromNib 2016-03-24 10:31:28.333 SIMAlbum[33599:524075] SecondView awakeFromNib 2016-03-24 10:31:28.771 SIMAlbum 2016-03-24 10:55:17.506 SIMAlbum[35103:546098] SecondView awakeFromNib 2016-03-24 10:55:17.625 SIMAlbum 接下来push进第二个viewController: 2016-03-24 10:55:38.848 SIMAlbum[35103:546098] SecondView awakeFromNib 2016
但是还有个方法可以实现那个就是KVO #import "MessageCell.h" @implementation MessageCell - (void)awakeFromNib { [ super awakeFromNib]; // Initialization code self.bradgeView.layer.masksToBounds = YES; self.bradgeView.layer.cornerRadius
initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier中修改属性,因为根本不会调用该方法,但是会调用awakeFromNib - (void)awakeFromNib { //UIView->CALayer 下边两个要一起设置 self.appImageView.layer.cornerRadius
bySwizzledSelector:@selector(mo_InitWithFrame:)]; [self methodSwizzlingWithOriginalSelector:@selector(awakeFromNib ) bySwizzledSelector:@selector(mo_AwakeFromNib)]; }); } - (instancetype)mo_Init { id __self = [self Zapfino" size:self.font.pointSize]; if (font) { self.font = font; } return __self; } - (void)mo_AwakeFromNib { [self mo_AwakeFromNib]; UIFont *font = [UIFont fontWithName:@"Zapfino" size:self.font.pointSize
self.contentView.bounds.height) self.contentView .addSubview(oneImage) } override func awakeFromNib () { super.awakeFromNib() // Initialization co } override func setSelected
initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { // 仅包含了xib里设置的数据,在初始化后会调用awakeFromNib 方法,我们需要把额外初始化动作写在这里 } - (void)awakeFromNib { [super awakeFromNib]; [self someInit]; } - (void)someInit self.name = @""; } 补充: 不同的数据源: -NSKeyUnarchiver:归档文件初始化,包含了整个对象的数据 -UINibDecoder:仅包含了xib里设置的数据,在初始化后会调用awakeFromNib
method [self localizeNibObject]; // this actually calls the original awakeFromNib (and not localizeNibObject ) because we did some method swizzling } +(void)load { // Autoload : swizzle -awakeFromNib with localizeNibObject = class_getInstanceMethod([NSObject class], @selector(localizeNibObject)); Method awakeFromNib = class_getInstanceMethod([NSObject class], @selector(awakeFromNib)); method_exchangeImplementations (awakeFromNib, localizeNibObject); } @end /////////////////////////////////////////////////////////
); if (self = [super initWithCoder:aDecoder]) { } return self; } // xib 加载 完成 - (void)awakeFromNib { [super awakeFromNib]; NSLog(@"%s", __FUNCTION__); } // 加载视图(默认从nib) - (void)loadView { awakeFromNib 当awakeFromNib方法被调用时,所有视图的outlet和action已经连接,但还没有被确定,这个方法可以算作适合视图控制器的实例化配合一起使用的,因为有些需要根据用户喜好来进行设置的内容 ,无法存在storyBoard或xib中,所以可以在awakeFromNib方法中被加载进来。 这是它与awakeFromNib方法的一个区别。 假设我们在处理内存警告时释放view属性:self.view = nil。因此loadView方法在视图控制器的生命周期内可能被调用多次。
bottionY = 0.0 //最低值 var currentY = 0.0 //当前的Y值 let maxtop = 80.0 override func awakeFromNib () { super.awakeFromNib() countY() addPanRecoginer() addTapRecoginer(
init(coder:) has not been implemented") } //只有UIView且xib时才会调用该方法 override class func awakeFromNib () { super.awakeFromNib() print(#function) } //加载vc中的view。
override func awakeFromNib() { super.awakeFromNib() // Initialization code cellImg.layer.borderWidth
修改的方法是如下; - (void)awakeFromNib { [super awakeFromNib]; //awakeFromNib方法中添加约束 [self setupConstraints
NSColor.lightGray.set() NSRectFill(dirtyRect) // Drawing code here. } override func awakeFromNib () { super.awakeFromNib() let pan = NSPanGestureRecognizer(target: self, action: #selector
override func awakeFromNib() { super.awakeFromNib() self.avatarView.layer.cornerRadius override func awakeFromNib() { super.awakeFromNib() // Initialization code } static override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func awakeFromNib() { super.awakeFromNib() collectionView.register(UINib(nibName