38

カメラビューがモーダルに表示されるカメラアプリに取り組んでいます。トリミングが終わったら。へのアンワインド セグエを実行しMainPageViewControllerます。(スクリーンショットをご覧ください)

絵コンテ

内部の巻き戻し関数MainPageViewControllerは次のとおりです。

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
    self.performSegueWithIdentifier("Categories", sender: self)
}

ここで、「カテゴリ」は からMainPageViewControllerへのプッシュ セグエ識別子CategoriesTableViewControllerです。

プログラムはunwindToMainMenu関数に入りますが、プッシュ セグエは実行しません。これを修正する方法はありますか?

注:同じ質問を見つけましたが、回答はストーリーボードの構造を変更することを示唆しています。

4

7 に答える 7

59

パーティーには少し遅れましたが、州旗を使わずにこれを行う方法を見つけました

注: これは iOS 9 以降でのみ機能します。カスタム セグエのみが iOS9 より前のクラス名をサポートし、ストーリーボードでカスタム セグエとして終了セグエを宣言することはできません。

1. UIStoryboardSegueWithCompletion で UIStoryboardSegue をサブクラス化する

class UIStoryboardSegueWithCompletion: UIStoryboardSegue {
    var completion: (() -> Void)?

    override func perform() {
        super.perform()
        if let completion = completion {
            completion()
        }
    }
}

2. UIStoryBoardSegueWithCompletion を終了セグエのクラスとして設定します

注:このセグエのアクションはunwindToMainMenu、元の質問と一致する必要があります

ストーリーボードから終了セグエを選択 カスタムクラスを追加

3. アンワインド @IBAction を更新して、完了ハンドラーでコードを実行します。

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
    if let segue = segue as? UIStoryboardSegueWithCompletion {
        segue.completion = { 
            self.performSegueWithIdentifier("Categories", sender: self) 
        }
    }
}

終了セグエが遷移を完了した後にコードが実行されるようになりました

于 2016-06-02T21:27:05.263 に答える
12

今のところ、この問題に対する独自の解決策を提供したいと思います。それ以上の回答はいつでも大歓迎です。

にブール変数とviewDidAppear関数を入れましたMainPageViewController

var fromCamera = false

override func viewDidAppear(animated: Bool) {
    if fromCamera {
        self.performSegueWithIdentifier("categorySelection", sender: self)
        self.fromCamera = false
    }
}

unwind segue from を実行する前にfromCameraに設定します。そうすることで、クロップビューからアンワインドセグエが実行された場合にのみ、カテゴリ画面へのセグエを実行します。trueCropViewController

于 2014-12-16T12:31:26.303 に答える
5

前の2つの回答を進めて、目的のcバージョンについてもう少し詳しく説明します here (私もObjective-Cコードしかありませんでした)

  1. UIStoryboardSegueWithCompletion を持つ UIStoryboardSegue のサブクラス

    クラス UIStoryboardSegueWithCompletion: UIStoryboardSegue { var 補完: (() -> Void)?

    override func perform() {
        super.perform()
        if let completion = completion {
            completion()
        }
    }
    

    }

UIStoryboardSegueWithCompletion.h

#import <UIKit/UIKit.h>

@interface MyStoryboardSegue : UIStoryboardSegueWithCompletion

@property (nonatomic, copy) void(^completion)();

@end

UIStoryboardSegueWithCompletion.m

#import "UIStoryboardSegueWithCompletion.h"

@implementation UIStoryboardSegueWithCompletion

- (void)perform {
  [super perform];
  if (self.completion != nil) {
    [self.destinationViewController.transitionCoordinator
     animateAlongsideTransition:nil
     completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
       if (![context isCancelled]) {
         self.completion();
       }
     }];
  }
}
@end
  1. UIStoryBoardSegueWithCompletion を出口セグエのクラスとして設定します

注: このセグエのアクションは、元の質問と一致するように unwindToMainMenu にする必要があります [セグエ ui を示す画像][1] [セグエ ui 2 を示す画像][2]

ストーリーボードから終了セグエを選択 カスタムクラスを追加

-(IBAction)unwindToMainMenu(UIStoryboardSegue *)segue {
    if([segue isKindOfClass:[UIStoryboardSegueWithCompletion class]]){
        UIStoryboardSegueWithCompletion *segtemp = segue;// local prevents warning
        segtemp.completion = ^{
            NSLog(@"segue completion");
            [self performSegueWithIdentifier:@"Categories" sender:self];
        };
    }
}

終了セグエが遷移を完了した後にコードが実行されるようになりました

于 2017-03-24T17:06:48.347 に答える
3

exit segue IBAction メソッドは、実際のアンワインド セグエが終了する前に発生します。私は同じ問題を抱えていて、この方法で解決しました(コードの言い換えを気にしない場合)。ViewDidAppear に依存することによる余分な時間とアニメーションを回避します。

@IBAction func unwindToMainMenu(segue: UIStoryboardSegue) {
   let categoriesTable = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("CategoryTableViewController")
   self.navigationController?.viewControllers.append(categoriesTable)
   self.navigationController?.showViewController(categoriesTable, sender: self)
}

これが、これに遭遇し、瞬時に移行したいだけの人に役立つことを願っています!

于 2015-09-24T22:40:20.743 に答える