这里链接的示例代码工作得很好,它允许UIScrollView显示图像,并对当前图像前后的图像进行分页和预览:
- http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html
- https://github.com/alexrepty/Paging-Enabled-UIScrollView-With-Previews
我试图将示例封装在可以重用的单个控件中。所以我创建了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完全像在原来的ScrollViewPagingExampleViewController xib。它的File's Owner's class被设置为PagingScrollView,它的scrollView出口被设置为子UIScrollView。
在ScrollViewPagingExampleViewController中,我简单地声明:
IBOutlet PagingScrollView *pagingScrollView;
在IB中,我拖动一个视图,将其类设置为PagingScrollView,并将其PagingScrollView出口连接到PagingScrollView。
在awakeFromNib中,scrollView属性为nil。我认为,由于scrollView在相同的nib中连接在IB中,它将在此时可用。
令人困惑的是,在ScrollViewPagingExampleViewController。xib中有一个名为scrollView的空出口。这可能表明存在一个与PagingScrollView.xib中定义的实例不同的PagingScrollView实例。
因此,我不能用实际的子视图填充UIScrollView。我哪里做错了?
这里有一个很好的回答这个问题:在awakeFromNib中访问视图?
长话短说,视图可能会在awakeFromNib中加载,但它的内容是惰性加载的,这就是为什么你应该使用viewDidLoad而不是awakeFromNib来实现你想要的。
对于在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
}
虽然,我发现真正的秘密是你不子类化一个.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)
}
我遇到了这个问题,像你一样,其他文章不适用。我有一个ViewController,它有自己的视图。在那个ViewController的。xib文件中,我放了一个视图并给了它CustomView类。除了CustomView是在它自己的.xib文件中定义的事实之外,这将工作得很好,所以在awakeFromNib中,所有的iboutlet都是nil。这是因为在接口构建器中没有办法将.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,你可以在自定义视图中设置item:
class PointsTableViewCell: UITableViewCell {
@IBOutlet weak var pointsTitleLabel: UILabel! {
didSet {
self.pointsTitleLabel.text = "Points"
}
}
}