使用自定义XIB的自定义UIView上的EXC_BAD_ACCESS

Van*_*nel 18 objective-c uiview ios

我正在使用最新的SDK开发iOS 5+应用程序.

我创建了一个TopMenuView带有自定义XIB 的自定义UIView().在Interface Builder上,我已经在这个XIB上更改了UIViewTopMenuView.我没有设置任何File's Owner.

TopMenuView.m我有:

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self)
    {
        NSLog(@"init with coder: %d", counter);
        counter++;
        // Add custom XIB
        NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView"
                                                             owner:nil
                                                           options:nil];
        UIView *nv = [topMenuView objectAtIndex:0];

        [self addSubview:nv];
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

使用Interface Builder我添加了UIViewa UIViewController并将此类更改UIViewTopMenuView.

但是,当我运行应用程序时,我收到4251次此日志消息: 2013-10-13 20:49:34.078 MyProject[470:c07] init with coder: 0

然后,我得到一个EXC_BAD_ACCESS:

NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView"
                                                             owner:nil
                                                           options:nil];
Run Code Online (Sandbox Code Playgroud)

JYe*_*Yeh 59

它多次调用initWithCoder的原因是由于.xib文件中的类设置错误.

确保文件所有者上的自定义类是您的自定义UIView类:

在此输入图像描述

并确保根视图上的类是默认的UIView:

在此输入图像描述

现在,这就是您在自定义类中所需的全部内容(在Swift中):

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    let view = NSBundle.mainBundle().loadNibNamed("TopMenuView", owner: self, options: nil)[0] as! UIView
    self.addSubview(view)
    view.frame = self.bounds
}
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,如果您的自定义类来自另一个项目,例如Cocoapods依赖项,那么您还需要填写Module字段(位于自定义类的下方). (2认同)

Seb*_*ddd 10

你最有可能进入无限循环,因为你是递归调用的initWithCoder.一种解决方法是首先检查您的子类是否包含任何子视图.

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        if (self.subviews.count == 0) {
            NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView" owner:nil options:nil];
            UIView *nv = [topMenuView objectAtIndex:0];
            [self addSubview:self.view];
        }
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)


Gee*_*der 3

我就是这样做的:

//Add Custom View to my main view of viewcontroller
self.customNavView = [[CustomNavigationView alloc] init];
self.customNavView = [[[NSBundle mainBundle] loadNibNamed:@"CustomNavigationView" owner:self options:nil] objectAtIndex:0];
[self.customNavView setFrame:CGRectMake(0, 20, 320, 54)];
[self.view addSubview:self.customNavView];    
Run Code Online (Sandbox Code Playgroud)

这里 CustomNavigationView 是一个 UIView 子类,其中文件所有者类为 UIView,UIView 自定义类为 CustomNavigationView。

这对我有用。