0

現在、画面のヘッダーのプレースホルダーとして機能する UIView サブクラスを含む複数の xib を持つ iOS アプリに取り組んでいます。ビュー コントローラーが nib から読み込まれると、HeaderView プレースホルダーがインスタンス化されます。HeaderView クラスには、プレースホルダー ビューを実際のビューに置き換えるメソッドがあります。コードは次のとおりです。

- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
{
    if (![[self subviews] count])
    {
        if (headerViewNib == nil)
            headerViewNib = [UINib frameworkNibWithNibName: @"HeaderView"];

        HeaderView * headerView = [[headerViewNib instantiateWithOwner: controller options: nil] lastObject];

        [headerView setTranslatesAutoresizingMaskIntoConstraints: NO];

        return headerView;
    }
    return self;
}

これまでのところ、すべてが正しく機能しています。しかし、ポップオーバーに似たメニューをヘッダーに追加する必要があります。そこで、HeaderView xib に UIButton を追加しました。予想どおり、すべてのビュー コントローラーに表示されますが、そのボタンのタッチを管理する必要があります。「- (IBAction)showHeaderMenu」メソッドを基本 UIViewController クラスに追加し、HeaderView.xib でファイルの所有者をこのクラスに構成したので、ボタン タッチ アクションを showHeaderMenu アクションに接続できました。問題は、instantiateWithOwner:options: メソッドの所有者として「コントローラー」を渡していることです。しかし、このコントローラーはゼロです。そのため、メニュー ボタンのタッチ イベントは処理されません。

そのため、「コントローラー」プロパティを正しく設定する方法を探しています。現時点では、すべてのビュー コントローラー xib で、プレースホルダー ヘッダービューの「コントローラー」アウトレットをファイルの所有者 (コントローラー) に接続しましたが、機能していないようです。

提案する別のパターンがある場合、それによって私の HeaderView.xib またはプレースホルダー ビューを強制的に削除する必要はありません。私はオープンです :)

4

1 に答える 1

1

あなたの問題を正確に把握できるかどうかはわかりませんが、何かがロードされていないか、コードを介してIBActionイベントリスナーをいつでもセットアップできるため、IBを介してIBActionをセットアップできないことに関連している場合。

UIButton *yourButton = [[UIButton alloc] init];
[yourButton addTarget:self action:@selector(myMethod:) forControlEvents:UIControlEventTouchUpInside]
于 2013-10-26T13:34:54.663 に答える