Swift / Scenekit で XCode 6 beta 5 を使用しています。ボタンとして使用したい SCNNode (3D SCNText オブジェクト) があります。これをセグエに接続するにはどうすればよいですか? ストーリーボードまたはプログラムで?SCNNode のコードを、セグエに接続するストーリー ボードの非表示のボタンに接続することを考えましたが、それはハックのように思えました。
2 に答える
これは、マップ アノテーションからセグエを実行する場合、同じテーブル セルから複数のセグエを動的に選択する場合、 SpriteKit イベント処理に応答してセグエを実行する場合、または何かに応答してセグエを実行する必要があるその他の場合と同じです。これは、IB で設定したコントロールをユーザーがタップするのではなく、コードで発生します。「手動」のセグエが必要です。
- ストーリーボードで、(ソース) ビュー コントローラー自体から目的のビュー コントローラーにドラッグしてセグエを作成します (ボタンまたは他のコントロールからドラッグするのではなく)。インスペクタ ペインを使用して、セグエの識別子を定義します。
- コードでセグエをトリガーする何かが発生した場合は、
performSegueWithIdentifier:
定義した識別子を使用して呼び出します。(このコードがビュー コントローラー クラス内にある場合は、 on で呼び出すことができますself
。それ以外の場合は、セグエするビュー コントローラーへの参照が必要になります。)
@FlippinFun が指摘しているように、SceneKit Game Xcode テンプレートでタッチ処理のコードを見つけることができます。(自宅でフォローしている人にとっては、その要点は、ビューのhitTest
メソッドを使用して、タッチ/クリックの場所でシーン要素を見つけることです。) には、 を呼び出す場所がありますperformSegueWithIdentifier
。
しかし、問題があります。そのテンプレートはタッチ処理コードをビュー コントローラーではなくビュー クラス内に配置するため、タッチ処理コードは現在のビュー コントローラーを認識しません。「最高の MVC アーキテクチャ」から「最も迅速かつダーティ」にランク付けされたいくつかの可能なソリューション:
サブクラス化
SCNView
してタッチ処理コードを実装する代わりに、UITapGestureRecognizer
代わりにインスタンスを使用してください。ビュー コントローラーでアクション メソッドを呼び出すことができます。その後、レコグナイザーのlocationInView
メソッドを使用してポイントを取得できますhitTest
。そこにはまだビュー コントローラー コードがあるself.performSegueWithIdentifier
ので、ヒット テストの結果が得られたら呼び出すことができます。SCNView
サブクラスでは、それを所有するビュー コントローラーへの (弱い!) 参照を保持します。次に、ビューのタッチ処理コードがperformSegueWithIdentifier
そのビュー コントローラーで呼び出すことができます。(ビューがビュー コントローラー クラスを認識する必要がないように物事を抽象化したい場合は、プロトコルを定義します。)SCNView
サブクラスのタッチ処理コードで、 を使用しself.window.rootViewController
てビュー コントローラーを検索し、結果をビュー コントローラー クラスにキャストします。