this の質問からのすばらしい回答で、アンワインドセグエとは何か、そしてそれをどのように使用するかを理解しました。どうもありがとう。
ただし、次のような質問があります。
シーンAにセグエを巻き戻すボタンがシーンBにあり、それをセグエする前に、データベースにデータを保存するなど、何かを実行したいとします。このボタンのアクションをB.Swiftで作成しましたが、アクションを指定せずに直接シーンAに移動するようです。
誰でもこれを行う理由または方法を知っていますか?
ありがとうございました。
記述した方法で、または巻き戻し元のviewControllerでprepareForSegue
オーバーライド関数を使用して、次のように行うことができます。
@IBAction func actionForUnwindButton(sender: AnyObject) {
println("actionForUnwindButton");
}
または...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
println("prepareForSegue");
}
最初の例は、あなたが説明したとおりです。ボタンは、アンワインドセグエおよびInterface Builderのボタンアクションに配線されます。ボタンアクションは、セグエアクションの前にトリガーされます。おそらく、インターフェースビルダーのボタンにアクションを関連付けていませんか?
2番目の例では、セグエのsourceViewController
とdestinationViewController
にもアクセスできます(これらも目的のビューコントローラのアンワインドセグエ関数で取得できます)。
ボタンのローカルアクションが完了するまでアンセグエを遅らせたい場合は、self.performSegueWithIdentifier
を使用して(ストーリーボードに接続する代わりに)ボタンアクションから直接セグエを呼び出すことができます(またはwrUS61の提案に従います)。
[〜#〜]編集[〜#〜]
ボタンを巻き戻しセグエとボタンアクションの両方に接続することによってこれを機能させることができるかどうか、いくつかの疑問があるようです。私はこのような小さなテストプロジェクトをセットアップしました:
class BlueViewController: UIViewController {
@IBAction func actionForUnwindButton(sender: AnyObject) {
println("actionForUnwindButton");
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
println("prepareForSegue");
}
}
class RedViewController: UIViewController {
@IBAction func unwindToRed(sender: UIStoryboardSegue) {
println("unwindToRed");
}
}
BlueViewControllerには、ストーリーボードでunwindToRed
巻き戻しセグエとactionForUnwindButton
ボタンの両方に接続されたボタンがあります。また、prepareForSegue
もオーバーライドするため、プレイの順序を記録できます。
出力:
actionForUnwindButton
prepareForSegue
unwindToRed
ストーリーボード:
編集2
あなたのデモプロジェクトはこれが機能しない動作していることを示しています。違いは、アクションをトリガーするためにbarButtonItemを使用しているのに対し、私は通常のボタンを使用していることです。通常のボタンは成功するのに対し、barButtonItemは失敗します。私suspectこれは、メッセージの受け渡しの順序の違いが原因である(以下は推測ですが、観察された動作と一致します):
(A)View ControllerのUIButton
ViewControllerのボタンがtouchupInsideを受け取る
-(1)アクションをメソッドに送信します
-(2)セグエ巻き戻しアクションをストーリーボードセグエに送信します
受信されたすべてのメッセージ、およびこの順序で実行されたメソッド:
actionForUnwindButton
prepareForSegue
unwindToRed
(B)ナビゲーションコントローラーツールバーのUIBarButtonItem
ツールバーbuttonItemはtouchupInsideを受け取ります
-(1)セグエ巻き戻しアクションをストーリーボードセグエに送信します
-(2)(場合によっては)アクションをviewControllerのメソッドに送信します
実行順序は
prepareForSegue
unwindToRed
actionForUnwindButton
prepareForSegue
およびunwind
メッセージを受信しました。ただし、segue中にviewControllerが破棄されるため、actionForUnwindButton
メッセージはnilに送信されます。したがって、実行されず、ログが出力されます
prepareForSegue
unwindToRed
(B)の場合、viewControllerはメソッドが到達する前に破棄されるため、トリガーされません。
だからあなたのオプションは...
(a)アクション付きのUIButtonを使用し、セグエをほどく
(b)prepareForSegue
を使用してアクションをトリガーします。これは、viewControllerがまだ生きている間に、セグエが発生する前にトリガーされます。
(c)巻き戻しセグエを使用せず、ボタンアクションを使用してください。アクションメソッドでは、ナビゲーションコントローラーでpopToViewController
を呼び出すことにより、「巻き戻す」ことができます。
ちなみに、(ナビゲーションコントローラのツールバーを使用せずに)viewControllerにツールバーを実装した場合、結果は同じです。最初にセグエがトリガーされるため、ボタンアクションは失敗します。
ウインドセグエを成功させることができるなら。次に、宛先ビューコントローラーのメソッドがセグエが発生する直前に呼び出されます。セグエオブジェクトを使用することにより、ソースビューコントローラーで必要な操作を実行できます。
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
CustomViewController *vc = (CustomViewController*) unwindSegue.sourceViewController;
[vc performAnyMethod];
[vc saveData];
NSString *temp = vc.anyProperty;
}
ソースコントローラーのロジックが必要な場合は、シーンBにprepareForSegueを実装し、シーンBの[終了]の下の[ストーリーボード]> [左側のビューの階層パネル]>から、風のセグエ識別子を設定します。
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([[segue identifier] isEqualToString:@"backToSource"])
{
NSLog(@"Going Back");
}
}
最初に、prepareForSegueメソッドでデータ送信関数を呼び出す必要があります。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([[segue identifier] isEqualToString:@"UnwindIdentifier"]) {
// send data
}
}
サーバーから応答を取得する前にアンセグエを発生させたくない場合は、オーバーライドする必要があります
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
メソッドとreturn NO;
。次に、次を呼び出すことにより、サーバーの応答を受け取ったときに手動でセグエを実行できます。
[self performSegueWithIdentifier:@"UnwindIdentifier" sender:sender];