This question already has answers here:
UIView and initWithFrame and a NIB file. How can I get the NIB file loaded?

(5个答案)


5年前关闭。




我创建了一个自定义UIView子类,并且希望不要在UIView子类的代码中布局UI。我想为此使用xib。所以我要做的是以下几点。

我创建了一个类“ShareView”,该类继承了UIView。我创建了一个XIB文件,其文件所有者设置为“ShareView”。然后,我链接在“ShareView.h”中声明的一些导出。

接下来,我有一个ViewController,MainViewController,它将ShareView添加为 subview 。这段代码:
NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"ShareView" owner:nil options:nil];
UIView *fv = [[arr objectAtIndex:0] retain];
fv.frame = CGRectMake(0, 0, 320, 407);
[self.view addSubview:fv];

但是现在我在ShareView中声明的插座上出现NSUnknownKeyException错误。

之所以这样做,是因为我想要一个UIView,它在单独的XIB文件中具有自己的逻辑。我在几个地方读到ViewControllers仅用于管理全屏,即不是屏幕的一部分。
那我在做什么错?我希望在单独的类中使用ShareView的逻辑,所以我的MainController类不会因ShareView的逻辑而(肿(我认为这是解决此问题的一种方法?)

最佳答案

托马斯·M

对于将行为封装在自定义 View 中(例如,带有用于最小/最大/当前值的伴随标签的滑块,其中值更改事件也由控件内部处理),我们有类似的想法。

在我们当前的最佳实践中,我们将在Interface Builder(ShareView.xib)中设计ShareView,如Eimantas在其回答中所述。然后,将ShareView嵌入到MainViewController.xib中的 View 层次结构中。

我在iOS开发人员博客中写下了如何embed custom-view Nibs inside other Nibs。问题的关键在于在您的自定义 View 中覆盖-awakeAfterUsingCoder:,用从“嵌入式”笔尖(ShareView.xib)加载的对象替换了从MainViewController.xib加载的对象。

遵循以下原则:

// ShareView.m
- (id) awakeAfterUsingCoder:(NSCoder*)aDecoder {
    BOOL theThingThatGotLoadedWasJustAPlaceholder = ([[self subviews] count] == 0);
    if (theThingThatGotLoadedWasJustAPlaceholder) {
        // load the embedded view from its Nib
        ShareView* theRealThing = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([ShareView class]) owner:nil options:nil] objectAtIndex:0];

        // pass properties through
        theRealThing.frame = self.frame;
        theRealThing.autoresizingMask = self.autoresizingMask;

        [self release];
        self = [theRealThing retain];
    }
    return self;
}

关于iphone - 带有自己的XIB的UIView子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5246074/

10-12 14:30