Ios IBOutlet是';t在awakeFromNib中连接

Ios IBOutlet是';t在awakeFromNib中连接,ios,uiscrollview,iboutlet,awakefromnib,Ios,Uiscrollview,Iboutlet,Awakefromnib,此处链接的示例代码非常有用,它允许UIScrollView显示带有分页的图像,并预览当前图像前后的图像: 我试图将示例封装在一个可以重用的控件中。所以我创建了一个PagingScrollView: @interface PagingScrollView : UIView { IBOutlet UIScrollView * scrollView; } @property (nonatomic,retain) IBOutlet UIScrollView * scrollView;

此处链接的示例代码非常有用,它允许UIScrollView显示带有分页的图像,并预览当前图像前后的图像:

我试图将示例封装在一个可以重用的控件中。所以我创建了一个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中的视图完全相同。其文件所有者的类设置为PagingScrollView,其scrollView输出设置为子UIScrollView

在ScrollViewPagingExampleViewController中,我只声明:

IBOutlet PagingScrollView   *pagingScrollView;
在IB中,我拖动一个视图,将其类设置为PagingScrollView,并将其PagingScrollView出口连接到PagingScrollView

在awakeFromNib中,scrollView属性为nil。我认为既然scrollView连接在同一个nib中的IB中,那么现在就可以使用它了

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


因此,我无法用实际的子视图填充UIScrollView。我做错了什么?

这个问题有一个很好的答案:


长话短说,视图可能在awakeFromNib中加载,但其内容加载缓慢,这就是为什么您应该使用viewDidLoad而不是awakeFromNib来实现您想要实现的目标。

我遇到了这个问题,与您一样,其他文章也不适用。我有一个ViewController,它有自己的视图。在ViewController的.xib文件中,我放置了一个视图,并将其命名为CustomView类。除了CustomView在其自己的.xib文件中定义之外,这将非常有用,因此在awakeFromNib中,所有iboutlet都是零。这是因为在interface builder中无法将.xib文件链接在一起。因此,当我的ViewController的视图显示在屏幕上时,它会尝试实例化CustomView,而不是加载CustomView.xib文件

这里有一个详细的工作,但要点是我必须在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
}
尽管如此,我发现真正的秘密在于您没有对.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)
}
let bundle:bundle=bundle(for:type(of:self))
让nib:UINib=UINib(nibName:,bundle:bundle)
如果let view=nib.instantiate(withOwner:self,options:nil)。首先是作为?UIView{
view.frame=bounds
view.autoresizingMask=[.flexibleWidth、.flexibleHeight]
view.translatesAutoresizingMaskIntoConstraints=true
添加子视图(视图)
}

使用Swift设置后,您可以在自定义视图中使用项目:

class PointsTableViewCell: UITableViewCell {

    @IBOutlet weak var pointsTitleLabel: UILabel! {
        didSet {
            self.pointsTitleLabel.text = "Points"
        }
    }
}

这与您的问题无关,但我以不同的方式实现了您提供的github项目。我想你可能会感兴趣。上传到(),你找到这个问题的解决方案了吗,索菲?我有一个类似的问题,我有一个ViewController和一个关联的视图,但我试图将我在Interface Builder中构建的子视图从xib加载到我的父视图w/controller中。即使在视图期间,子视图的输出也始终为空。将显示在父视图的视图控制器中。但是,控件的默认值确实会在运行时显示。我只是没有找到初始化它们的方法。UIView没有viewDidLoad,这是UIViewController中的一个方法。在上面的示例代码中,PagingScrollView是一个UIView。也许问题可以归结为,如何将使用IBOutlets的自定义控件嵌入到同样具有IBOutlets的自定义控件中。我从未在任何项目中见过这种行为。。。直到我开始使用故事板。它似乎违背了awakeFromNib方法的目的?非常奇怪。嘿,亚当,我现在遇到了完全相同的问题。当在故事板中使用对象时,包含在awakeFromNib中为零的IBOutlets的对象,而在常规nib中,它工作正常。这个答案绝对正确。永远不要在awakeFromNib中制作动画,就这么简单。这行不通。正在讨论的视图仍然是动画,等等,作为它即将出现的一部分。(如果使用故事板等,这一点都没有区别,自古以来,这是iOS开发的正常部分。)关于Sofi的问题,是的视图(因此)没有viewDidLoad方法。在“没有”视图控制器的情况下,您必须从视图的主控者手动调用您编写的方法(如“youAreLoadedPleaseRunMyAnimationsNow”)。@SofisofTwarelc我遇到了本质上相同的问题,并且能够使用此视频解决它: