我想知道awakeFromNib()和viewDidLoad()之间的关键区别,以便更清楚地了解它是如何工作的.请有人解释一下吗?
我开始将更多的视图层次结构移动到IB.
我有一个名为"AlignmentViewController.xib"的nib文件,我在其中使用AlignmentViewController作为文件所有者设置我的视图层次结构.这很好用.
我仍然模糊的方法之一是awakeFromNib.在AlignmentViewController的以下代码片段中,我添加了一个额外的方法awakeFromNib.但是,它不会被调用:
- (void)awakeFromNib {
NSLog(@"AlignmentViewController - awakeFromNib");
[super awakeFromNib];
}
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
if (nil != self) {
self.title = @"Alignment";
self.chromosomeName = chromosomeName;
self.basepairStart = basepairStart;
self.basepairEnd = basepairEnd;
self.wantsFullScreenLayout = YES;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
有人能为我澄清我在这里错过了什么吗?
干杯,道格
更新:在阅读了一些答案后,我意识到我需要深入了解非常基本的东西.
看初始化:
- (id)initWithChromosomeName:(NSString *)chromosomeName
basepairStart:(NSUInteger)basepairStart
basepairEnd:(NSUInteger)basepairEnd {
self = [self initWithNibName:@"AlignmentViewController" bundle:nil];
Run Code Online (Sandbox Code Playgroud)
我注意到我正在调用initWithNibName:bundle:indirect.这是不好的做法吗?AlignmentViewController.xib文件定义了我的视图层次结构.但我不是真的使用initWithNibName:bundle:以典型的方式?有一个更好的方法吗?
我一直在尝试在awakeFromNib中设置UIImageView背景颜色(见下文)
[imageView setBackgroundColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1.0]];
Run Code Online (Sandbox Code Playgroud)
当它不起作用时,我意识到它可能是因为视图尚未加载,我应该将颜色更改移动到viewDidLoad.
我可以证实我有这个权利吗?
加里
EDIT_002:
我刚开始一个新项目,从一个干净的开始检查这一点.我像往常一样设置视图.结果是控件确实在awakeFromNib中设置为(null).这是我有的:
码:
@interface iPhone_TEST_AwakeFromNibViewController : UIViewController {
UILabel *myLabel;
UIImageView *myView;
}
@property(nonatomic, retain)IBOutlet UILabel *myLabel;
@property(nonatomic, retain)IBOutlet UIImageView *myView;
@end
Run Code Online (Sandbox Code Playgroud)
.
@synthesize myLabel;
@synthesize myView;
-(void)awakeFromNib {
NSLog(@"awakeFromNib ...");
NSLog(@"myLabel: %@", [myLabel class]);
NSLog(@"myView : %@", [myView class]);
//[myLabel setText:@"AWAKE"];
[super awakeFromNib];
}
-(void)viewDidLoad {
NSLog(@"viewDidLoad ...");
NSLog(@"myLabel: %@", [myLabel class]);
NSLog(@"myView : %@", [myView class]);
//[myLabel setText:@"VIEW"];
[super viewDidLoad];
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
awakeFromNib ...
myLabel: (null)
myView : …Run Code Online (Sandbox Code Playgroud) 据我所知,awakeFromNib将始终在viewDidLoad之前调用.
所以我有一个UITableViewController的子类,它是从xib文件中取消归档的.
我在里面定义了这两个方法:
- (void)awakeFromNib {
[super awakeFromNib];
NSLog(@"awake from nib");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"view did load");
}
Run Code Online (Sandbox Code Playgroud)
会发生什么是"视图确实加载"出现在控制台中"从笔尖唤醒"之前.我试图在[超级awakeFromNib]上使用断点,并反复点击F7(Step Into),令我惊讶的是,它进入 - (void)viewDidLoad之前进入awakeFromNib内的第二行.
有谁知道这里发生了什么?我在常规UIViewController的子类中做了完全相同的事情,并且日志语句被反转,正如我最初期望的那样......
我正在浏览iTunes上的斯坦福iphone开发讲座,并在第5讲中遇到了这个问题.我们正在努力确保在设备旋转时进行重绘.我有两个与此相关的问题:
谢谢.
-(void)setup
{
self.contentMode = UIViewContentModeRedraw;
}
-(void)awakeFromNib
{
[self setup];
}
-(id)initWithFrame:(CGRect)frame
{
self=[super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
Run Code Online (Sandbox Code Playgroud) 假设有一个默认的 Xcode Cocoa 应用程序模板,其中 App Delegate 位于主 XIB 文件中。
当然applicationWillFinishLaunching:是之前调用的applicationDidFinishLaunching:。
之前为什么会awakeFromNib被叫? applicationWillFinishLaunching:
文档是applicationWillFinishLaunching:这样说的:
在应用程序对象初始化之前由默认通知中心发送。
为什么这与之前awakeFromNib被调用并不矛盾? applicationWillFinishLaunching:
我可以信赖这个订单吗?
iphone ×3
objective-c ×3
awakefromnib ×2
viewdidload ×2
cocoa ×1
cocoa-touch ×1
ipad ×1
nib ×1
swift ×1
uitableview ×1
xib ×1