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 。这段代码:
但是现在我在ShareView中声明的插座上出现NSUnknownKeyException错误。
之所以这样做,是因为我想要一个UIView,它在单独的XIB文件中具有自己的逻辑。我在几个地方读到ViewControllers仅用于管理全屏,即不是屏幕的一部分。
那我在做什么错?我希望在单独的类中使用ShareView的逻辑,所以我的MainController类不会因ShareView的逻辑而(肿(我认为这是解决此问题的一种方法?)
(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