IBOutlet未在awakeFromNib中连接

Sof*_*LLC 27 uiscrollview iboutlet ios awakefromnib

此处链接的示例代码效果很好,允许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.我在这做错了什么?

ash*_*ack 13

这里有一个非常好的答案:在awakeFromNib中访问View?

简而言之,视图可能会加载到awakeFromNib中,但其内容会被懒惰地加载,这就是为什么你应该使用viewDidLoad而不是awakeFromNib来实现你想要实现的目标.

  • UIView没有viewDidLoad,这是UIViewController中的一个方法.在上面的示例代码中,PagingScrollView是一个UIView.也许问题归结为,如何在一个也有IBOutlets的自定义控件中嵌入一个使用IBOutlets的自定义控件. (37认同)

Set*_*hmr 5

对于在Swift 4中找到合适答案的任何人,这里就去。

override func awakeAfter(using aDecoder: NSCoder) -> Any? {
    guard subviews.isEmpty else { return self }
    return Bundle.main.loadNibNamed("MainNavbar", owner: nil, options: nil)?.first
}
Run Code Online (Sandbox Code Playgroud)

虽然,我发现真正的秘密是您不继承.xib文件的主视图。而是使文件所有者成为您想要的类,并在类init内添加Nib:

let bundle: Bundle = Bundle(for: type(of: self))
let nib: UINib = UINib(nibName: "<Nib File Name>", bundle: bundle)
if let view = nib.instantiate(withOwner: self, options: nil).first as? UIView {
    view.frame = bounds
    view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.translatesAutoresizingMaskIntoConstraints = true
    addSubview(view)
}
Run Code Online (Sandbox Code Playgroud)