2017-02-15 9 views
0

私のアプリのヘッダーは、現在全幅、65ptの高さのUIViewで、すべてのページの汎用ヘッダーとして使用されています。UIViewからUIViewControllerにナビゲート

class AppHeader: UIView { 
    ... 
} 

その後、私のMain.storyboardに私はAppHeaderとして指定し、そのクラスを持つオブジェクトライブラリからの眺めとのUIViewControllerを持っています。

私のAppHeader(UIView)には複数のボタンがあり、クリックすると現在表示されているページ/コントローラに移動します。

AppHeaderクラスからは、現在のメソッドを使用して別のコントローラをスコープ内に表示することはできません。ここで

は私AppHeader.xibです:

enter image description here

どのように私はこの問題を解決することができますか?

答えて

1

これは非常に悪い動作です。UIViewをヘッダーとして使用しないでください。ナビゲーションビューコントローラをアプリケーションの最初のビューコントローラとして追加する必要があります。ナビゲーションビューコントローラにはナビゲーションバーがあり、そこに必要なボタンを置くことができます。それから、他のView Controllerをプッシュまたは表示することができます。それがまだない場合、あなたのAppHeaderUIViewのカスタムサブクラスを閲覧してくださいhttps://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewControllerCatalog/Chapters/NavigationControllers.html

+0

ああ、ちょうど写真を見ました。彼はナビゲーションバーの動作を複製しているのですか? –

1

は、公式ドキュメントを確認してください。ビュー内のボタンのアクションをIBActionメソッドに配線します。

AppHeaderDelegateProtocolを作成します。 AppHeaderクラスに弱い代理プロパティを与えます。そのプロトコルで、AppHeaderがボタンを押していることをビューコントローラに知らせるメソッドを定義します。

AppHeaderのインスタンスを含むビューコントローラにAppHeaderDelegateProtocolを実装します。

AppHeaderのビューコントローラを所有する各インスタンスにデリゲートプロパティを接続します。

それはそれを行う必要があります。

+0

私の答えはあなたが聞いたことをする方法を提供しますが、Joanが答えて言うように、より良い答えは「しないでください」と言います。 –

0

プロトコルを作成することができます - それをAppHeaderDelegateまたは何か - と呼び、他のviewControllerがそのプロトコルを採用するように設定します。あなたは、特定のボタンが押されたことをデリゲートに知らせる関数を定義することができ、デリゲートのviewControllerは正しいView Controllerを提示することによってそれに反応することができます。

アップルのドキュメントに関するプロトコルhere

また、NotificationCenterを使用して通知をブロードキャストして、特定のボタンが押されたことをサブスクライバに通知し、viewControllerがこれらの通知をリスンしてそれに応じて対応させることができます。 1つの通知に反応しようとするいくつかのオブジェクトがあるので、クラスの開始/停止を管理する必要があります。

関連する問題