6

シンプルなストーリーボードのセットアップ:UINavigationControllerを使用したUIViewController。テーブルセルをクリックすると、カスタムセグエが新しいUIViewControllerをナビゲーションスタックにプッシュします。すべて良い。ただし、ナビゲーションバーの[戻る]ボタンを押すと、デフォルトのポップアニメーションのみが使用されます。

ポップバックするときにカスタムセグエを使用するようにナビゲーションコントローラーに指示するにはどうすればよいですか?私は追加しました

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

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender

両方のビューコントローラに送信されますが、まったく呼び出されません。

私は何が欠けていますか?

4

3 に答える 3

11

これは、カスタムセグエを使用する代わりに、カスタムトランジションを作成することで実現できます。理解するのに少し時間がかかりましたが、基本的にはとても簡単です。最初のビューコントローラがUINavigationControllerDelegateプロトコルを採用していることを確認してください。次に、まだ最初のView Controllerで、次のメソッドを実装します。

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                              animationControllerForOperation:(UINavigationControllerOperation)operation
                                           fromViewController:(UIViewController *)fromVC
                                             toViewController:(UIViewController *)toVC
{
return X // where X is an animation Controller object, an instance of the animator class.  
}

まだ最初のViewController(たとえば、ViewDidLoad)で、最初のViewControllerがそのデリゲートとして機能することをnavigationcontrollerに伝えます。

self.navigationController.delegate = self;

最後になりましたが、UIViewControllerAnimatedTransitioningプロトコルを採用するアニメータークラスを作成します。次のメソッドを実装します。

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext

最初のメソッドは遷移コードを保持します。このトランジションコードは、戻るボタンをタップすると自動的に使用されます。

これは非常に単純なサンプルプロジェクトです。

于 2014-06-06T13:58:27.827 に答える
2

次のようなものを使用してみましたか?

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    return [MyCustomSegueInitMethod viewControllerA:vc1 viewControllerB: vcB];
}

カスタムセグエを作成したことはありませんが、カスタムセグエクラスがUIStoryBoardSegueをサブクラス化している限り、それらをオーバーライドするときに他のすべてのクラスと同じように機能すると仮定すると、機能するはずです...

次に、戻るボタンがViewControllerの下のバーにある「終了」アイコンにリンクされていることを確認します。

于 2013-03-20T17:04:34.147 に答える
2

アンワインドセグエは、カスタムセグエを含むセグエを「ロールバック」するのに役立ちます。ユースケースの問題は、セグエ自体にあるのではなく、戻るボタンからアンワインドセグエをトリガーしたいという事実にあります。

これは、巻き戻しを使用せずにこれを回避することを試みることができますが、標準の戻るボタンがタップされたときにカスタムセグエをトリガーします。

// MyDetailViewController.m:
- (void)viewWillDisappear:(BOOL)animated
{
    if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
        // trigger custom segue (but note that the sourceViewController
        // has already been removed from the nav controller)
    }
    [super viewWillDisappear:animated];
}

明らかに、これは巻き戻しとは何の関係もありません。最初に詳細ビューコントローラを「プッシュ」するために使用したセグエを「ロールバック」するために実装するカスタムセグエを実行するだけです。

これがどうなるか教えてください。

于 2013-03-22T16:39:32.740 に答える