0

nib の複数のインスタンスを収容するカスタム コンテナー ViewController を構築しています。この nib は、DemoViewController としてサブクラス化された ViewController を保持します。

コンテナの viewWillAppear 中に、次のことを実行します。

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"Container will appear");


    if (_selectedViewController.parentViewController == self)
    {
        // nowthing to do
        return;
    }

    DemoViewController *vc = [[DemoViewController alloc] initWithNibName:@"Gauge" bundle:nil];

    NSArray *nibObjects = [[NSBundle mainBundle] loadNibNamed:@"Gauge" owner:self options:nil];
    // assuming the view is the only top-level object in the nib file (besides File's Owner and First Responder)
    UIView *nibView = [nibObjects objectAtIndex:0];

    // add as child VC
    [self addChildViewController:vc];

    [view1 addSubview:nibView];

    // notify it that move is done
    [vc didMoveToParentViewController:self];

}

実行時に、次の例外を受け取ります。

2012-07-02 21:59:22.734 ContainerViewController[21747:f803] コンテナ ビューの読み込み中
2012-07-02 21:59:22.737 ContainerViewController[21747:f803] コンテナが表示されます
2012-07-02 21:59:22.740 ContainerViewController[21747:f803] ゲージ ビューが読み込まれました
2012-07-02 21:59:22.742 ContainerViewController[21747:f803] ゲージは親コントローラーに移動します
2012-07-02 21:59:22.743 ContainerViewController[21747:f803] -[DemoViewController スーパービュー]: 認識されないセレクターがインスタンス 0x6a7daa0 に送信されました
2012-07-02 21:59:22.745 ContainerViewController[21747:f803] *** キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[DemoViewController スーパービュー]: インスタンス 0x6a7daa0 に送信された認識されないセレクター'
*** 最初のスロー コール スタック:
(0x13c9022 0x155acd6 0x13cacbd 0x132fed0 0x132fcb2 0x4fe4f 0x4a14b 0x2d2c 0xdc38f 0xdc5eb 0xdd4ed 0x4aa0c 0x4ff92 0x4a14b 0x39550 0x39670 0x39836 0x4072a 0x11596 0x12274 0x21183 0x21c38 0x15634 0x12b3ef5 0x139d195 0x1301ff2 0x13008da 0x12ffd84 0x12ffc9b 0x11c65 0x13626 0x276d 0x26d5)
例外をスローして呼び出された終了(lldb)

ここで何が起こっているのか誰にも分かりますか?残念ながら、Container View Controller に関するドキュメントはほとんどないので、困惑しています。

4

3 に答える 3

3

ところで、なぜ NIB 経由でビューを取得しようとしているのですか? なぜ以下ではないのですか?

childController = [[FirstContainedViewController alloc] initWithNibName:@"FirstContainedView" bundle:nil];
[self addChildViewController:childController];
[self.view addSubview:childController.view];
[childController didMoveToParentViewController:self];

これは私にとってはうまくいき、はるかに簡単に思えます。なぜあなたがしていることをしているのか理解できません。

于 2012-07-03T05:04:19.133 に答える
2

「Xcodeのファイル->新規->新しいファイル->ココアタッチ-> UIViewControllerサブクラス->ユーザーインターフェイス用のXIBを使用」を使用してペン先を作成すると、問題が解決しました。

最初はすべてを個別に作成し、ペン先のフレームをクリックして View Controller にリンクすることでそれらをリンクしていました (ストーリーボードのように)。これは完全に間違っていることがわかります。

代わりに、ファイルの所有者を ViewController ファイルにリンクする必要があります。

助けてくれてありがとう!

于 2012-07-09T23:08:05.167 に答える
0

あなたの NSLog() は問題を完全に示しています。その XIB の最上位オブジェクトは明らかに UIView ではなく、DemoViewController を指すファイルの所有者オブジェクトである可能性が最も高いです。メソッドを呼び出す際-addSubviewに、View Controller に送信しました。

于 2012-07-03T02:48:35.370 に答える