7

現在、を使用してView Controllerを提示しようとしていUIPresentationControllerます。私の問題は、カスタム遷移デリゲートが呼び出されるときです

func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController!, sourceViewController source: UIViewController) -> UIPresentationController? 

提示しているコントローラーがnil原因で、例外がスローされます。タブバーコントローラーに埋め込まれたナビゲーションコントローラーに埋め込まれたビューコントローラーから提示しています。これらのコントローラーからも同じ問題に提示しようとしました。カスタムモーダルプレゼンテーションがない場合にも適切に機能しますが、私の目標はそれをカスタマイズすることです。ボタンが選択されたときに呼び出します。コードは以下のとおりです。mapTransitionDelegateクラスプロパティに保持するカスタム遷移デリゲートです。また、EnlargedMapViewController()遷移するデリゲートが呼び出されるように、カスタム モーダル プレゼンテーションを持つように初期化されます。

var enlargedMapController = EnlargedMapViewController();
enlargedMapController.transitioningDelegate = mapTransitionDelegate;
presentViewController(enlargedMapController, animated: true, completion: nil);

将来の知識のために、この問題が発生している理由を知りたいです。UIPresentationController今のところ、この例外のため、私のサブクラスは初期化されていません。

4

1 に答える 1

0

UIViewController (およびそのサブクラス) の指定された初期化子は ですinit(nibName:bundle:)。ただし、ドキュメントには具体的に次のように記載されています。

これは、このクラスの指定された初期化子です。ストーリーボードを使用してビュー コントローラーとそれに関連付けられたビューを定義する場合、ビュー コントローラー クラスを直接初期化することはありません。代わりに、ビュー コントローラーは、セグエがトリガーされたときに自動的に、またはアプリがストーリーボード オブジェクトの instantiateViewControllerWithIdentifier: メソッドを呼び出したときにプログラムによって、ストーリーボードによってインスタンス化されます。ストーリーボードからビュー コントローラーをインスタンス化する場合、iOS は、このメソッドの代わりに initWithCoder: メソッドを呼び出して新しいビュー コントローラーを初期化し、nibName プロパティをストーリーボード内に保存されている nib ファイルに設定します。

呼び出しEnlargedMapViewController()は、Cocoa が部品を見つけるために必要なすべてのメカニズムをバイパスするため、正しい方法ではありません。EnlargedMapViewController.xib指定されたイニシャライザEnlargedMapViewController(nibName: nil, bundle: nil)を使用するか、少なくとも nib ファイル名をクラス名 (つまり、

しかし、他の場所でストーリーボードを使用している場合、ここでもストーリーボードを使用しないのはなぜでしょうか? そのシーンに識別子を設定して、instantiateViewControllerWithIdentifier:節約した時間と苦痛を楽しんでください。

于 2015-11-04T13:42:49.387 に答える