23

最新の SDK を使用して iOS 5 以降のアプリを開発しています。

TopMenuViewカスタム XIB を使用してカスタム UIView ( ) を作成しました。Interface Builder で、この XIB でUIViewクラスを に変更しましたTopMenuView。私は何も設定していません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;
}

Interface Builder を使用して、 を に追加UIViewし、このクラスを に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];
4

5 に答える 5

68

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
}
于 2016-03-10T17:05:32.677 に答える
11

を再帰的に呼び出しているため、おそらく無限ループに陥っていますinitWithCoder。1 つの回避策は、サブクラスにサブビューがあるかどうかを最初に確認することです。

-(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;
}
于 2015-03-04T12:13:23.563 に答える
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];    

ここで、CustomNavigationView は、Files Owner Class を UIView として、UIView カスタム クラスを CustomNavigationView として持つ UIView サブクラスです。

これは私にとってはうまくいきます。

于 2013-10-14T07:26:45.360 に答える
0

ストーリーボードからxibファイルをロードする方法をやり直すまで、同じエラーが発生していました。基本的には、xib ファイルのルート ビューからコードに @IBOutlet を作成する必要がありました。また、xib のファイルの所有者をカスタム クラスに設定していることを確認してください。

import UIKit
class ResuableCustomView: UIView {

    @IBOutlet var view: UIView!
    @IBOutlet weak var label: UILabel!

    @IBAction func buttonTap(sender: UIButton) {
        label.text = "Hi"
    }

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

        NSBundle.mainBundle().loadNibNamed("ReusableCustomView", owner: self, options: nil)[0] as! UIView
        self.addSubview(view)
        view.frame = self.bounds
    }
}

このプロジェクトを設定するための私の完全な答えはこちらです。

于 2015-12-30T07:29:49.453 に答える