2

我在这里看到了一些似乎符合我所追求的答案,但我无法让它们中的任何一个起作用。

MyView是一个 UIView 子类,其中有一些图像和文本字段MyView.xibMyView.(h|m). File's Owner在XIB中没有设置,但是MyView是顶层对象的类。在运行时,我通过NSBundle's loadNibNamed. 一切都很顺利。

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

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

4

2 回答 2

1

最简单的解决方案是创建MyView一个子视图,它是其余子视图的容器。MyVC.xib这为您提供了 in和 what's in之间的单点联系MyView.xib,并允许您连接两个 xib 中的插座。

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

MyView.xib中,将顶级视图的类设置为UIView。将 File's Owner 的类设置为MyView. 如果您有任何MyView已连接到的插座,MyView.xib则需要将它们重新连接到 File's 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's outlets 连接到 things inMyVC.xib和 things in MyView.xib,并且您可以将其他对象的 outletsMyVC.xib连接MyView.xibMyView. 但是,您不能将其他对象的出口连接MyVC.xib到其他对象,MyView.xib反之亦然。

于 2013-03-20T21:40:31.760 回答
0

ORIGINAL:覆盖initWithCoder,正如下面的评论所说的那样是个坏主意

新建议:

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

然后在 MyVC 的 viewDidLoad: 方法中:

  • 使用您的 nib 创建新的 MyView 实例,MyView 中的每个实例一个

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

于 2013-03-19T21:50:37.310 回答