• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何将 UIView XIB "import"转换为 UIViewController XIB?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:47:10 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

MyView 是一个 UIView 子类,其中有一些图像和文本字段在 MyView.xib 中布局和设置样式,并绑定(bind)到 MyView.(h |m)。在XIB中没有设置File's Owner,但是MyView是顶层对象的类。在运行时,我通过 NSBundle's loadNibNamed 将各种 MyView 动态加载到某些 View Controller 中。一切都很顺利。

但我有另一个 View Controller ,MyVC,在设计时我想填充几个 MyView 实例。根据直觉,我在 MyVC.xib 中布局了一个与 MyView 大小相同的 UIView 对象,将其类型设置为 MyView,在 MyVC 中添加了一个 IBOutlet 声明。 h,然后连接上。

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



Best Answer-推荐答案


最简单的解决方案是让 MyView 有一个 subview ,它是其余 subview 的容器。这为您提供了 MyVC.xib 中的内容和 MyView.xib 中的内容之间的单点联系,并允许您连接两个 xib 中的 socket 。

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

MyView.xib中,设置顶层 View 的类为UIView。将 File's Owner 的类设置为 MyView。如果您在 MyView 上有任何在 MyView.xib 中连接的 socket ,则您需要将它们重新连接到 File's Owner,因为顶级 View 不再具有这些 socket 。

-[MyView initWithCoder:] 中,加载 MyView.xib 并将其顶级 View 添加为您的 subview 。未经测试的示例:

+ (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)initWithCoderNSCoder *)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 respondsToSelectorselector(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 的 outlet 连接到 MyVC.xib 中的事物和 MyView.xib 中的事物,并且您可以将MyVC.xibMyView.xib 中其他对象的导出连接到MyView 的实例。但是,您不能将 MyVC.xib 中其他对象的 outlet 连接到 MyView.xib 中的其他对象,反之亦然。

关于ios - 如何将 UIView XIB "import"转换为 UIViewController XIB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509386/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap