IBOutlet 在 awakeFromNib 中未连接



这里链接的示例代码工作得很好,它允许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"
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新