繁体   English   中英

如何“导入” UIView XIB到UIViewController XIB?

[英]How to “import” a UIView XIB into a UIViewController XIB?

我在这里看到了一些答案,这些答案似乎可以满足我的要求,但是我无法使它们中的任何一个起作用。

MyView是一个UIView子类,具有在MyView.xib布置和设置样式并绑定到MyView.(h|m) IBOutlet的少数图像和文本字段。 没有在XIB中设置File's Owner ,但是MyView是顶级对象的类。 在运行时,我通过NSBundle's loadNibNamed各种MyView动态加载到某些视图控制器中。 一切顺利。

但是我还有另一个视图控制器MyVC ,在设计时,我想用几个MyView实例填充它。 按照直觉,我在MyVC.xib布置了一个与MyView相同大小的UIView对象,将其类型设置为MyView ,在MyVC.h添加了IBOutlet声明,并建立了连接。

当我运行时, MyVC显示MyView 但是调试表明已经建立连接,该视图确实是MyView ,并且MyView's awakeFromNib确实执行了。 而且我确定MyVC's MyView位于层次结构的顶部,因为我将其背景设置为漂亮的鲜红色。 那么MyView在哪里呢?

最简单的解决方案是使MyView具有一个子视图,该子视图是其其余子视图的容器。 这给你接触的之间有什么在单点MyVC.xib ,什么是在MyView.xib ,并且让你在既xibs连接插座。

MyVC.xib ,将每个占位符视图的类设置为MyView

MyView.xib ,将顶级视图的类设置为UIView 将文件所有者的类设置为MyView 如果MyView.xib中已连接MyView上的任何插座,则由于顶级视图不再具有这些插座,因此您需要将它们重新连接到File的Owner。

-[MyView initWithCoder:] ,加载MyView.xib并将其顶级视图添加为子视图。 未经测试的示例:

+ (UINib *)nib {
    static dispatch_once_t once;
    static UINib *nib;
    dispatch_once(&once, ^{
        nib = [UINib nibWithNibName:NSStringFromClass(self) bundle:[NSBundle bundleForClass:self]];
    });
    return nib;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        NSArray *contents = [[self.class nib] instantiateWithOwner:self options:nil][0];
        UIView *containerView = contents[0];

        // Make sure the container view's size tracks my size.
        containerView.frame = self.bounds;
        containerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        self.autoresizesSubviews = YES;
        if ([self respondsToSelector:@selector(setTranslatesAutoresizingMaskIntoConstraints:)]) {
            self.translatesAutoresizingMaskIntoConstraints = YES;
            containerView.translatesAutoresizingMaskIntoConstraints = YES;
        }
        // If you're using autolayout in both xibs, you should probably create
        // constraints between self and containerView here.

        [self addSubview:containerView];
    }
    return self;
}

这样做,你可以连接效果MyView的网点东西MyVC.xib和东西MyView.xib ,你可以在其他对象的出口连接MyVC.xibMyView.xib以实例MyView 但是,你不能在连接其他对象的网点MyVC.xib在其他物体MyView.xib反之亦然。

原文:覆盖initWithCoder,一个不好的主意,如下面的评论所述

新建议:

  • 使用您现在拥有的技术创建MyVC视图(MyView实例实质上是空视图)

然后在MyVC的viewDidLoad:方法中:

  • 使用您的笔尖创建一个新的MyView实例,对于MyView中的每个实例

  • 将每个空的(即占位符)MyView替换为刚创建的MyViews,确保正确设置了框架(设置了所有属性/ ivars,并使用'-(void)exchangeSubviewAtIndex:(NSInteger)index1和SubviewAtIndex:(NSInteger)index2 '将子视图数组中的旧视图替换为新视图)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM