2013-07-18 15 views
23

私は、Apple独自のモーダルビューコントローラ(UIViewControllerサブクラスとして実装しています)と非常に似ているコンテナ内にビューコントローラを表示するカスタムセグを作成しました。-segueForUnwindingToViewController:fromViewController:identifier:呼び出されていない

私は今カスタムunwind segueを作成しようとしていますが、メソッド-segueForUnwindingToViewController: fromViewController: identifier:を呼び出す方法はありません。

私は正しいビューコントローラ(このモーダルを提示したもの)を指し示すことができるので、私のコンテナに-viewControllerForUnwindSegueAction: fromViewController: withSender:を実装しましたが、私のカスタムunwind segueのために求められるメソッドはどこでも呼び出されません。

このモードを解除する唯一の方法は、-returned:メソッドで行うことです。

誰でもカスタムリライングセグを使ってこれを正常に実行できましたか?


EDIT: もう少しコードとコンテキスト

マイアンワインドビューコントローラはないプログラムで、ストーリーボードで構成されています。

私は私のコントローラでリラックスseguesに関連するコードのこれらの作品があります。私はここに私のカスタムモーダル(-dismissModalViewControllerWithCompletionBlock:)を解任するためのカスタムメソッドを使用してい

PresenterViewController.mを。ここで

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController 
             fromViewController:(UIViewController *)fromViewController 
               identifier:(NSString *)identifier { 
    return [[MyModalUnwindSegue alloc] initWithIdentifier:identifier 
                source:fromViewController 
               destination:toViewController]; 
} 

-(IBAction)returned:(UIStoryboardSegue *)segue { 
    if ([segue.identifier isEqualToString:@"InfoUnwindSegue"]) { 
     [self dismissModalViewControllerWithCompletionBlock:^{}]; 
    } 
} 

MyModalViewController.m

私は私がリラックスするべきであるビューコントローラを指すように-viewControllerForUnwindSegueAction: fromViewController: withSender:を使用しています。私は期待していた

- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action 
             fromViewController:(UIViewController *)fromViewController 
               withSender:(id)sender { 
    return self.myPresentingViewController; 
} 

挙動はMyModalViewControllerは巻き戻しを処理し、その後、このビューコントローラは-returned:が呼び出される前に、彼の-segueForUnwindingToViewController: fromViewController: identifier:メソッドが呼び出されていたはずですビューコントローラを指すように呼ばれていたということでした。

今すぐ-segueForUnwindingToViewController: fromViewController: identifier:が呼び出されることはありません。

私はすでに別の設定を試みたと言わなければなりません。どこでも、私は決して呼び出されないゆるやかなセグを返すために私の方法を入れました。私はナビゲーションコントローラーをサブクラス化して呼び出すことができますが、私のソリューションにどのように収まるかわかりません。


EDIT 2:追加情報

私はMyModalViewControllerが、私はそれが提示する通常のモーダルビューコントローラを却下したいときに呼び出さ彼-segueForUnwindingToViewController: fromViewController: identifier:メソッドを持っていることをチェックしました。これは、彼が階層の一番上のUIViewControllerだからかもしれません。

これを確認した後、私はUINavigationControllerをサブクラス化し、代わりにこのサブクラスを使用してPresenterViewControllerを格納しました。彼の-segueForUnwindingToViewController: fromViewController: identifier:メソッドが呼び出されていることに気付くのは驚きでした。

私は、コンテナーとして機能するビューコントローラーだけがこのメソッドを呼び出すと信じています。それは他のView Controllerを提示する唯一のものではないので、私にはほとんど意味をなさないものです。彼らの子供たちもそうしています。

このサブクラスでロジックを作成して、どのクラスを使用するかを選択することは、このクラスでは子どもが何をしたのか分かりません。

アップルフォーラムは、今すぐサポートが中止されています。誰かがこの作品の仕組みに関する情報を持っていれば助けてください!私はこれについての資料の欠如は、これがまだどれほど不安定であるかの良い指標であると思います。

+0

あなたは現在表示したいのですか? –

+0

これまでに試したコードを表示する必要があります。 – rdelmar

+0

@rdelmar、ここにあります。特定のコードを見たいかどうか教えてください。 –

答えて

5

このメソッドは、親コントローラで宣言する必要があります。したがって、カスタムセグを持つナビゲーションコントローラを使用している場合は、UINavigationControllerをサブクラス化し、このメソッドを定義します。 UINavigationControllerの子ビューの1つで定義する場合は、UINavigationControllerのcanPerformUnwindSegueAction:fromViewController:withSenderをオーバーライドして、ハンドラの子を検索させることができます。

埋め込みビュー(コンテナビュー)を使用している場合は、親ビューコントローラで定義します。

WWDC 2012セッション407の最後の10分を参照してください - このアプリケーションがなぜ機能するのかを理解するためにストーリーボードを採用する!

+0

ビューコントローラを宣言しなければならない私の記述を特定できますか?あなたはそれが動作する方法についての説明を見つけることができますか?私の意見では、UINavigationControllerは、子どもが元のセグを作成して作成したものではないので、自分自身を与える前に、子供にアンワインドセグを尋ねるべきです。なぜこのように機能するのかについては、別の説明がありますか? –

+1

あなたの説明から、私は100%確実ではありません。しかし、UINavigationControllerは最初にdibを取得します。これは、ルートに戻したいと思う可能性が高いため、そこから遠く離れたバックコントローラの1つになる可能性が高いからです。あなたがたぶん巻き戻しセグを使用しないであろう一つのコントローラをバックアップしたいだけなら、たぶんpopViewControllerを呼び出すだけでしょう。最終的に、それはアップルのいくつかのフレームワークエンジニアが –

11

@Jeremyの回答に追加するには、モーダルUIViewControllerからUINavigationController内に含まれているUIViewControllerを解凍して、私のUINavigationControllerサブクラスで次のコードを使用して正しく動作させました。

// Pass to the top-most UIViewController on the stack. 
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *) 
      toViewController fromViewController:(UIViewController *) 
      fromViewController identifier:(NSString *)identifier { 
    UIViewController *controller = self.topViewController; 
    return [controller segueForUnwindingToViewController:toViewController 
            fromViewController:fromViewController 
              identifier:identifier]; 
} 

..、次いでUINavigationController内の実際のViewControllerに通常通りsegueForUnwindingToViewControllerを実現します。

+0

+1で決める最適化のように見えます。これは私を助けた。この新しいカスタムnavコントローラを私のアプリのメインナビゲーションコントローラとして使用する。他に何も壊れないことを願って... – Jonny

+0

本当に私のアプリの周りの他の場所を台無しにしてしまったので、私は戻って別の解決策をとった。私の+1を削除できません;-)とにかく後で役に立つ知識があるかもしれません。 – Jonny

+0

正直言って(私にとってはうまくいった)上記を発見してからずっと前に、私はセグのすべてをあきらめて、すべてのことをコードで行いました。だから、そんなに簡単に!すべてがうまくいった! –

0

あなたがUINavigationControllerを使用していて、segueがpushViewControllerを呼び出している場合、カスタムunwind segueを使用するには、UINavigationControllerをサブクラス化して- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifierをオーバーライドする必要があります。

私はCloseDoorSegueと呼ばれるカスタムアンワインドセグを持っています。ストーリーボードのナビゲーションコントローラクラスとしてあなたUINavigationControllerサブクラスを設定し

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier { 

UIStoryboardSegue* theSegue; 

if ([identifier isEqualToString:@"CloseDoor"]) { 
    theSegue = [CloseBookSegue segueWithIdentifier:identifier source:fromViewController destination:toViewController performHandler:^(void){}]; 
} else { 
    theSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; 
} 

return theSegue; 

}

:私UINavigationControllerサブクラスの実装は次のようになります。識別子として「CloseDoor」を使用してExitイベントを正しく設定していれば、良いことになるはずです。また、UINavigationControllersプッシュ/ポップメカニズムと並行して消えるのではなく、あなたの巻き戻しセグで 'popViewControllerAnimated'を呼び出すようにしてください。

0

iOS development Library この方法と一緒にiOS開発ライブラリに関するディスカッションがあります。 - segueForUnwindingToViewController:fromViewController:identifier: MyModalViewControllerがコンテナのサブコントローラではなくコンテナの役割であることを確認してください。 [anotherVC addChildViewController:myModalViewController];のようなものがある場合は、segueForUnwindingToViewControllerメソッドをある種の "AnotherVC.m"ファイルに配置する必要があります。

ディスカッション あなたは も巻き戻しセグエ使用するカスタムコンテナビューコントローラを実装する場合は、このメソッドをオーバーライドする必要があります。あなたのメソッド の実装では、 ビューコントローラの巻き戻しに必要なアニメーションやその他の手順を実行するカスタムセグオブジェクト をインスタンス化して返す必要があります。

関連する問題