現在、画面のヘッダーのプレースホルダーとして機能する 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 またはプレースホルダー ビューを強制的に削除する必要はありません。私はオープンです :)