我创建了一个自定义 UIView 子类,并且不希望在 UIView 子类中的代码中布局 UI。我想使用 xib 来实现这一点。所以我所做的如下。
我创建了一个“ShareView”类,它是 UIView 的子类。我创建了一个 XIB 文件,其文件所有者设置为“ShareView”。然后我链接了我在“ShareView.h”中声明的一些出口。
接下来我有一个 ViewController MainViewController,它将 ShareView 添加为子视图。这段代码:
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 文件中拥有自己的逻辑。我在几个地方读到 ViewController 仅用于管理全屏,即不是屏幕的一部分......
那么我做错了什么?我希望 ShareView 的逻辑位于一个单独的类中,这样我的 MainController 类就不会因 ShareView 的逻辑而变得臃肿(我认为这是解决此问题的选项?)
ThomasM,
我们对于将行为封装在自定义视图中也有类似的想法(例如,带有最小/最大/当前值的伴随标签的滑块,值更改事件也由控件内部处理)。
在我们当前的最佳实践中,我们将在 Interface Builder 中设计 ShareView(ShareView.xib
),正如 Eimantas 在他的回答中所描述的那样。然后我们将 ShareView 嵌入到视图层次结构中MainViewController.xib
.
我写下了我们如何将自定义视图 Nib 嵌入其他 Nib 中 http://blog.compeople.eu/apps/?p=142在我们的 iOS 开发者博客中。症结在于压倒一切-awakeAfterUsingCoder:
在您的自定义视图中,将从 MainViewController.xib 加载的对象替换为从“嵌入式”Nib (ShareView.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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)