- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们当前的best-practice for custom views是:
+loadInstanceFromNib
中执行此操作)。我们实际上想要的是将自定义 View Nib“嵌入” View Controller Nib中。如果做不到这一点,至少我们想添加和将自定义 View 实例放置在 View Controller Nib 中(看不到其内容)。
我们已经非常接近以下解决方案:
@implementation CustomView
static BOOL loadNormally;
- (id) initWithCoder:(NSCoder*)aDecoder {
id returnValue = nil;
if (loadNormally) { // Step 2
returnValue = [super initWithCoder:aDecoder];
loadNormally = !loadNormally;
} else { // Step 1
loadNormally = !loadNormally;
returnValue = [CustomView loadInstanceFromNib];
}
return returnValue;
}
- (id) initWithFrame:(CGRect)frame {
loadNormally = YES;
self = (id) [[CustomView loadInstanceFromNib] retain];
self.frame = frame;
return self;
}
// ...
@end
如果我们以编程方式实例化自定义 View ,我们将使用 -initWithFrame:
,它将从 Nib 加载 View (它将调用 -initWithCoder:
并直接转到标记为“步骤 2”的 if 分支),设置其框架,并将其保留计数设置为 1。
但是,如果我们在 View Controller Nib 内实例化自定义 View ,(诚然相当难看)静态 loadNormally
变量最初是 NO
:我们从“第 1 步”开始”,在确保我们将立即使用 -initWithCoder:
的“正常”if 分支之后,我们加载并返回从其 Nib 加载的实例。从自定义 View Nib 加载意味着我们回到 -initWithCoder:
,这次使用 loadNormally==YES
,即我们让 Nib 加载机制完成其工作并返回自定义 View 实例。
结果总结:
最佳答案
我们最终找到了一种更好的方法,其中涉及在自定义 View 中覆盖 -awakeAfterUsingCoder:
,将从 View Controller Nib 加载的对象替换为从“嵌入式”Nib 加载的对象( CustomView.xib)。
我写了how we embed custom-view Nibs inside other Nibs在一篇内容广泛的博客文章中。
代码是这样的:
// CustomView.m
- (id) awakeAfterUsingCoder:(NSCoder*)aDecoder {
BOOL theThingThatGotLoadedWasJustAPlaceholder = ([[self subviews] count] == 0);
if (theThingThatGotLoadedWasJustAPlaceholder) {
// load the embedded view from its Nib
CustomView* theRealThing = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([CustomView 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;
}
关于uiview - 可插入自定义 View Nib (Nib-in-a-Nib) : Memory leak – why?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6357547/
我是一名优秀的程序员,十分优秀!