3

一段时间以来,我一直在为表格使用自定义单元格(带有自己的笔尖)而没有问题。现在在一个新项目中,我看到需要一个可重用的自定义视图(不是单元格),它会有一个标题、一个按钮和另一个 UIVIew 来保存更多视图。我将其称为“部分”:

在此处输入图像描述

这个想法是能够在故事板中使用这个部分(使用 UIView 并相应地设置自定义类)。这样,我在 UIView 中放置的任何视图实际上都将包含在 Section 的内部 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',原因:'[setValue:forUndefinedKey:]:此类不符合键 sectionContainerView 的键值编码

  • 尝试了一种稍微不同的方法(在上面的代码中注释掉),将 XIB 的根添加到自定义类(addSubView)而不是设置为它。这并没有改变任何东西,相同的递归调用(或者如果设置了上面的错误)

我真的很感激这方面的一些指导。谢谢你。

4

2 回答 2

0

首先,递归调用在 initWithCoder: 上,加载一个 nib 意味着通过 initWithCoder: 实例化它的视图。

这就是为什么你不能以这种方式使用你在笔尖上设计的 UIView 子类(通过在情节提要上设置视图的类,甚至实际上在另一个笔尖上)。

使用它的唯一方法是通过 nib 在代码中实例化它。

Section *sectionView = [[[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:options] objectAtIndex:index];

现在,用您制作的笔尖连接东西:您可以将笔尖上的对象连接到笔尖上找不到的另一个对象。这就是文件所有者的用途。您必须设置其(文件所有者的)类,并建立与它的连接,并使用您希望实现连接的类的实例作为加载 nib 时的所有者参数。

但我想这不是你想要的。我认为您想让笔尖上的子视图可以通过“部分”访问,我认为这是笔尖上的根视图。您在 Section 类上创建 IBOutlet(或 IBAction、IBOutletCollection)属性。要将它们与笔尖上的其他对象连接起来,请控制单击笔尖上的“部分”视图,然后您将看到从那里做什么。

于 2014-06-13T17:06:37.727 回答
0

您需要使用Custom Container View情节提要中调用的组件。我不能只在此处发布代码,因为它涉及您的故事板中的一些配置,并且代码将取决于您如何了解您的视图/VC,但您可以在此处阅读相关指南:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

于 2014-06-07T05:28:39.517 回答