ビューとそのコントローラーを混同しているようです。viewControllers はスタックされておらず、単に nib または xib ファイルの一部です。一方、ビューはビュー階層の一部である場合があり、その意味で互いにオーバーレイすることができます。viewController の機能は、画面上のさまざまなビューを管理および調整することです。ビューコントローラーを使用して単一のボタンを管理するのは効率的ではありません。コントローラーの目的は、さまざまなボタン間の通信を容易にすることです (たとえば、番号 3 がタッチされたときにボタン 1、2、および 4 を無効にする)。複数のviewControllerを使用することはAppleによって推奨されていないという@bpapaの声明は、もはや正しくありません。iOs Application Programming Guideの現在のセクションWindows、Views、および View Controllersには、次のように記載されています。
ビュー コントローラは、単一の最上位ビューを直接管理し、そのビューのサブビューのすべてまたは一部を管理する場合があります。シンプルなユーザー インターフェイスの場合、ビュー コントローラーは通常、そのビュー階層内のすべてのビューを管理します。ただし、いくつかの異なる部分で構成されるより複雑なインターフェイスの場合、View Controller はビューのサブセットを管理し、1 つまたは複数のカスタム コントローラー オブジェクトに依存してビュー階層内の他のグループのビューを管理する場合があります。
ドキュメントで明確にされていないが、過去数週間で何度か私を悩ませたことの 1 つは、viewController を UIControl のアクションのターゲットにすることは、その viewController が nib のファイルの所有者である場合にのみ効果があるということです。たとえば、gameViewController と scoreViewController の 2 つの viewController を持つ nib があるとします。gameView には、ゲームのピースとして機能するいくつかのボタンが含まれる場合があり、それらに触れると、gameViewController の -(void)pieceHasBeenTouched:(id)sender メソッドにアクション メッセージが送信されます。これは、gameViewController がファイルの所有者である場合にうまく機能します。
scoreView にボタンがあり、scoreViewController にメッセージを送信できるようにすることは、論理的に思えるかもしれません。たとえば、saveScore などです。理由はまだよくわかりませんが、Responder チェーンでは許可されません。スコア ビューの [保存] ボタンでアクション メッセージを gameViewController に送信する必要があります。
この問題は、2 つのコントローラー間で IBOutlet バインディングを確立することで解決します。通知も別の可能性です。