簡體   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