Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
418 views
in Technique[技术] by (71.8m points)

ios - EXC_BAD_ACCESS on custom UIView with custom XIB

I'm developing an iOS 5+ app with latest SDK.

I have created a custom UIView (TopMenuView) with a custom XIB. On Interface Builder I have changed, on this XIB, UIView class to TopMenuView. I haven't set any File's Owner.

On TopMenuView.m I have:

- (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;
}

Using Interface Builder I have added a UIView to a UIViewController and changed this UIView class to TopMenuView.

But, when I run the app, I get this log message 4251 times: 2013-10-13 20:49:34.078 MyProject[470:c07] init with coder: 0

And then, I get an EXC_BAD_ACCESS here:

NSArray *topMenuView = [[NSBundle mainBundle] loadNibNamed:@"TopMenuView"
                                                             owner:nil
                                                           options:nil];
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The reason it's calling the initWithCoder so many times is due to wrong class setup in your .xib file.

Make sure the Custom Class on the File's Owner is your custom UIView class:

enter image description here

And make sure the class on the root View is the default UIView:

enter image description here

And now this is all you need in your custom class (in 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
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...