菜鸟教程小白 发表于 2022-12-12 09:47:10

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


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

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

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

<p>当我运行时,<code>MyVC</code> 没有显示 <code>MyView</code>。但是调试表明连接已经建立, View 确实是一个<code>MyView</code>,并且<code>MyView's</code> <code>awakeFromNib</code> 确实执行了。而且我确信 <code>MyVC's</code> <code>MyView</code> 位于层次结构的顶部,因为我将其背景设置为漂亮的亮红色。那么<code>MyView</code>到底在哪里?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>最简单的解决方案是让 <code>MyView</code> 有一个 subview ,它是其余 subview 的容器。这为您提供了 <code>MyVC.xib</code> 中的内容和 <code>MyView.xib</code> 中的内容之间的单点联系,并允许您连接两个 xib 中的 socket 。</p>

<p>在<code>MyVC.xib</code>中,将每个占位符 View 的类设置为<code>MyView</code>。</p>

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

<p>在 <code>-</code> 中,加载 <code>MyView.xib</code> 并将其顶级 View 添加为您的 subview 。未经测试的示例:</p>

<pre><code>+ (UINib *)nib {
    static dispatch_once_t once;
    static UINib *nib;
    dispatch_once(&amp;once, ^{
      nib = ];
    });
    return nib;
}

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

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

      ;
    }
    return self;
}
</code></pre>

<p>这样你可以将 <code>MyView</code> 的 outlet 连接到 <code>MyVC.xib</code> 中的事物和 <code>MyView.xib</code> 中的事物,并且您可以将<code>MyVC.xib</code> 和<code>MyView.xib</code> 中其他对象的导出连接到<code>MyView</code> 的实例。但是,您不能将 <code>MyVC.xib</code> 中其他对象的 outlet 连接到 <code>MyView.xib</code> 中的其他对象,反之亦然。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何将 UIView XIB&#34;import&#34;转换为 UIViewController XIB?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/15509386/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/15509386/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何将 UIView XIB &#34;import&#34;转换为 UIViewController XIB?