IBOutlet没有连接在awakeFromNib中

这里链接的示例代码效果很好,并允许UIScrollView在当前图像之前和之后显示具有分页和预览图像的图像:

  • http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html
  • https://github.com/alexrepty/Paging-Enabled-UIScrollView-With-Previews

我试图把这个例子封装在一个可以重用的控件中。 所以我创build了一个PagingScrollView:

@interface PagingScrollView : UIView { IBOutlet UIScrollView * scrollView; } @property (nonatomic,retain) IBOutlet UIScrollView * scrollView; @end 

污垢简单的实施

 - (void) awakeFromNib { [super awakeFromNib]; NSLog(@"awake from nib"); } 

在PagingScrollView.xib中,我把一个包含UIScrollView和ARScrollViewEnhancer的View完全和原来的ScrollViewPagingExampleViewController xib一样。 它的文件所有者的类被设置为PagingScrollView,并且其scrollView插口被设置为子UIScrollView。

在ScrollViewPagingExampleViewController中,我只声明:

 IBOutlet PagingScrollView *pagingScrollView; 

在IB中,我拖动View,将其类设置为PagingScrollView,并将其pagingScrollView插口连接到PagingScrollView。

在awakeFromNib中,scrollView属性为零。 我会认为,因为scrollView被连接在同一个笔尖的IB中,所以可以通过这一点。

令人困惑的是,在ScrollViewPagingExampleViewController.xib中,有一个名为scrollView的空出口。 这可能表示存在与PagingScrollView.xib中定义的不同的PagingScrollView实例。

因此,我不能用实际的子视图填充UIScrollView。 我在这里做错了什么?

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

长话短说,这个视图可能会在awakeFromNib中加载,但是它的内容会被延迟加载,这就是为什么你应该使用viewDidLoad而不是awakeFromNib来实现你想要实现的function。

我遇到了这个问题,就像你一样,其他的文章也不适用。 我有一个ViewController,它有自己的看法。 在那个ViewController的.xib文件中,我放了一个视图,并给了它CustomView的类。 除非CustomView是在自己的.xib文件中定义的,所以在awakeFromNib中自然是所有的IBOutlets都是零。 这是因为在接口生成器中没有办法将.xib文件链接在一起。 所以当我的ViewController的视图被放到屏幕上时,它会尝试实例化CustomView,而不是加载CustomView.xib文件。

有一个工作在这里http://cocoanuts.mobi/2014/03/26/reusable/详细,但要点是我必须在我的CustomView类中实现以下

 @implementation CustomView - (id)awakeAfterUsingCoder:(NSCoder *)aDecoder { if (![self.subviews count]) { NSBundle *mainBundle = [NSBundle mainBundle]; NSArray *loadedViews = [mainBundle loadNibNamed:@"CustomView" owner:nil options:nil]; return [loadedViews firstObject]; } return self; } @end 

对于任何人在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 } 

虽然,我发现真正的秘密是你没有inheritance.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) }