web-dev-qa-db-ja.com

ナビゲーションの戻るボタンでセグエを解きます

私は、Appleデモボードをアンボードセグエセクションで実装したストーリーボードのデモビデオを見て、メインビューのカスタムボタンを使用してデモを見てきました。

私はまた、ここでも機能する同じものの良い例を見てきました。 http://www.techotopia.com/index.php/Using_Xcode_Storyboarding_%28iOS_6%29#Unwinding_Storyboard_Segues

ただし、通常のプッシュセグエを親(メインフォームデータを含む)から子(詳細設定オプションを使用)に渡し、カスタムボタンをオンにするのではなく、ナビゲーションバーの戻るボタンを使用して親のビューコントローラーに戻りたいと思います。デモに示されているビュー。親コントローラーの[保存]ボタンをさらに押すと、親コントローラーはすべてをAPIサーバーに保存します。

ナビゲーションの[戻る]ボタンをオーバーライドして、巻き戻しのセグエアクションを指すことができないようです。[戻る]ボタンがストーリーボードに表示されないため、緑色の[終了]ボタンをドラッグできません。

これをviewDidLoadで試してアクションをオーバーライドしましたが、機能しませんでした[self.navigationItem.backBarButtonItem setAction:@selector(unwindSegueAction :)]。

戻るボタンでプッシュセグエを巻き戻すことはできますか?

これまでのところ最高のアイデアは、viewDidLoadメソッドから戻るボタンをオーバーライドすることでしたが、これにより、角度の付いた戻るボタンのスタイルが削除され、単純な問題への大まかなハックのようにも見えます

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(unwindSegue:)];

プロトコルとデリゲートを使用するための回答があることは知っていますが、Xcode4.5のアンワインドセグエメソッドの使用に興味があります。

31
Alan

ナビゲーションコントローラーを追跡することで親コントローラーメソッドへの参照を取得できるため、結局、セグエを巻き戻す必要はありませんでした。

子コントローラーの- (void)viewWillDisappear:(BOOL)animatedメソッドで次のようにして参照を取得できました

NSInteger currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];

FirstViewController *parent = (FirstViewController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex];

parent.barcodeType = indexPath.row;

設定変数を元のコントローラーに完全に戻しました。

子コントローラーの上部にある親コントローラーへのインポート参照も追加しました

14
Alan

@Alanは正しい方向に進んでいます。最初のビューコントローラに戻らないときにセグエが起動しないようにテストを追加するだけです。 viewWillDisappearのこのようなものは、実際には、戻るボタンの巻き戻しセグエを実行できるようにします。クラスから終了アイコンまでドラッグして、手動の巻き戻しセグエを作成する必要があります。作成後に必ず名前を付けてください。

UIViewController *vc = self.navigationController.topViewController;
if ([FirstViewController class] == [vc class])
{
    [self performSegueWithIdentifier:@"unwindSegue" sender:self];
}
6
Chuck H

上記の@Chuck H提案に続くSwiftソリューションを追加したいと思います。

let rootVC = self.navigationController!.topViewController
if rootVC.isKindOfClass(TheNameOfYourViewController) {
    performSegueWithIdentifier("yourNamedSegueIdentifier", sender: self)
}
5

考慮していない可能性のある別の方法は、親を子のデリゲートにして、子のデリゲートメソッドを使用して親を更新することです。

そうすれば、親がすでに戻った瞬間に最新の状態になっているので、ナビゲーションの巻き戻しに追加する必要を回避できます。

1
catalandres