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) }