我最近在我的应用程序中遇到了一个问题,我在UIViewController子类的-awakeFromNib方法中创建的一些子视图正 从视图中消失.经过一番探索之后,我发现移动我输入的代码-awakeFromNib来-viewDidLoad解决问题.-awakeFromNib当UIViewController从nib中取消归档时,似乎只调用一次,并且-viewDidLoad每次取消归档视图时都会调用它.
那么最佳做法是什么?看起来UIViewController -awakeFromNib不应该向视图添加任何视图,应该完成那种东西-viewDidLoad.我理解正确吗?还是我比我想的更困惑?
此处链接的示例代码效果很好,允许UIScrollView显示图像,其中包含分页和预览当前图像之前和之后的图像:
我试图将该示例封装在可以重用的单个控件中.所以我创建了一个PagingScrollView:
@interface PagingScrollView : UIView {
IBOutlet UIScrollView * scrollView;
}
@property (nonatomic,retain) IBOutlet UIScrollView * scrollView;
@end
Run Code Online (Sandbox Code Playgroud)
用泥土简单实施
- (void) awakeFromNib
{
[super awakeFromNib];
NSLog(@"awake from nib");
}
Run Code Online (Sandbox Code Playgroud)
在PagingScrollView.xib中,我将包含UIScrollView和ARScrollViewEnhancer的View与原始ScrollViewPagingExampleViewController xib完全相同.其File's Owner的类设置为PagingScrollView,其scrollView插槽设置为子UIScrollView.
在ScrollViewPagingExampleViewController中,我只是声明:
IBOutlet PagingScrollView *pagingScrollView;
Run Code Online (Sandbox Code Playgroud)
在IB中,我拖动一个View,将其类设置为PagingScrollView,并将其pagingScrollView插座连接到PagingScrollView.
在awakeFromNib中,scrollView属性为nil.我认为既然scrollView在同一个笔尖中连接在IB中,那么它就可以使用了.
令人困惑的是,在ScrollViewPagingExampleViewController.xib中,有一个名为scrollView的空插座.这可能表明PagingScrollView的实例与PagingScrollView.xib中定义的实例不同.
因此,我无法使用实际的子视图填充UIScrollView.我在这做错了什么?
根据NSObject UIKit Additions Reference,出口变量应该按照awakeFromNib调用的时间设置(强调所有我的):
nib加载基础结构将awakeFromNib消息发送到从nib归档重新创建的每个对象,但只有在归档中的所有对象都已加载并初始化之后.当一个对象收到一个awakeFromNib消息时,它保证已经建立了所有的插座和动作连接.
...
要点:由于无法保证从归档实例化对象的顺序,因此初始化方法不应将消息发送到层次结构中的其他对象.可以从awakeFromNib方法中安全地发送到其他对象的消息.
通常,您需要为需要在设计时无法完成的其他设置的对象实现awakeFromNib.例如,您可以使用此方法自定义任何控件的默认配置,以匹配用户首选项或其他控件中的值.您还可以使用它将单个控件还原到应用程序的某个先前状态.
但是,这与我的测试不符,至少使用Storyboard.以下测试的结果似乎与文档相矛盾:
someLabel从它调用到相应ViewController类的插座.awakeFromNib实现添加到第二个ViewController:.
- (void) awakeFromNib {
[super awakeFromNib];
if (self.someLabel == nil) {
NSLog(@"someLabel property is nil");
}
else {
NSLog(@"someLabel property is not nil");
}
if (_someLabel == nil) {
NSLog(@"_someLabel is nil");
}
else {
NSLog(@"_someLabel is not nil");
}
}
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我观察到以下记录:
2013-07-01 09:24:35.755 test[498:c07] someLabel property is nil
2013-07-01 09:24:35.758 test[498:c07] _someLabel …Run Code Online (Sandbox Code Playgroud)