【发布时间】:2014-06-07 04:52:27
【问题描述】:
一段时间以来,我一直在使用自定义单元格(带有自己的笔尖)来制作表格,没有任何问题。现在在一个新项目中,我看到需要一个可重用的自定义视图(不是单元格),它会有一个标题、一个按钮和另一个 UIVIew 来保存更多视图。我称它为“部分”:
我们的想法是能够在情节提要中使用此部分(使用 UIView 并相应地设置自定义类)。这样,我在该 UIView 中放置的任何视图实际上都将包含在该部分的内部 UIView 中。
我认为困难的部分是实际使用 IB 和 Storyboard 将视图放置在该内部 UIView 中,而不是 Section 的根 UIView 中。结果只是制作自定义视图(还没有任何内部视图)并没有像我预期的那样工作。下面是代码,它基于我已经完成和工作的数十个自定义单元格(尽管针对通用 UIView 的特定 init 方法进行了调整):
#import "SectionContainer.h"
@implementation SectionContainer
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil];
self = [nibArray objectAtIndex:0];
/*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil];
[self addSubview:[nibRoot objectAtIndex:0]];*/
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"SectionContainer" owner:self options:nil];
self = [nibArray objectAtIndex:0];
/*NSArray *nibRoot = [[UINib nibWithNibName:@"SectionContainer" bundle:nil] instantiateWithOwner:self options:nil];
[self addSubview:[nibRoot objectAtIndex:0]];*/
}
return self;
}
匹配的 XIB 将其根视图设置为此自定义类(就像我在自定义单元格中所做的那样)
问题
这个自定义类会导致 EXC_BAD_ACCESS 代码=2,从我可以通过单步执行来判断,就好像该类被递归调用一样。在调用 initWithDecoder 之后调用一个又一个调用,直到发生 EXC_BAD_ACCESS 错误
我的尝试
- 鉴于看似递归调用,我尝试了另一种方法,我看到将 XIB 的文件所有者设置为自定义类而不是 XIB 的根视图。这导致了以下错误:
'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: 这个类不符合 key sectionContainerView 的键值编码
- 尝试了一种稍微不同的方法(在上面的代码中注释掉),将 XIB 的根添加到自定义类 (addSubView) 中,而不是设置为它。这并没有改变任何东西,相同的递归调用(或者如果设置了上面的错误)
我非常感谢您对此提供一些指导。谢谢。
【问题讨论】:
标签: ios uiview customization nsunknownkeyexception