[解決済み] Unwind segueは何に使うのか、どう使うのか?
質問
iOS 6とXcode 4.5には、"Unwind Segue"と呼ばれる新機能があります。
Unwind seguesは、ストーリーボード内の既存のシーンのインスタンスに遷移することができます。
Xcode 4.5のリリースノートにあるこの短い記述に加え、UIViewControllerにいくつかの新しいメソッドが追加されたようだ。
- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
巻き戻しセグメンテーションの仕組みと用途について教えてください。
どのように解決するのですか?
ひとことで言うと
について アンワインドセグエ (と呼ばれることもあります。 出口セグエ ) は、プッシュ、モーダル、ポップオーバーのセグメントを戻るために使うことができます (ナビゲーションバーからナビゲーションアイテムをポップしたり、ポップオーバーを閉じたり、モーダルに表示されたビューコントローラを解除した場合のように)。さらに、1つだけでなく、一連のプッシュ/モーダル/ポップオーバーのセグメンテーションを実際にアンワインドすることができます。
アンワインドセグを実行する際には、アンワインド先のビューコントローラーのアクションメソッドを指定する必要があります。
Objective-Cです。
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
スウィフト
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
このアクションメソッドの名前は、ストーリーボードでアンワインドセグエを作成するときに使用されます。さらに、このメソッドはアンワインドセグエが実行される直前に呼び出されます。渡されたソースビューコントローラーから
UIStoryboardSegue
パラメータを使用して、セグメンテーションを開始したビューコントローラと対話します (たとえば、モーダルビューコントローラのプロパティ値を取得するなど)。この点で、このメソッドは
prepareForSegue:
メソッドの
UIViewController
.
iOS 8のアップデートです。 巻き戻しセグメンテーションは、iOS 8のアダプティブセグメンテーションでも機能します。 表示する と 詳細を表示 .
事例紹介
ナビゲーションコントローラと3つの子ビューコントローラを持つストーリーボードがあるとします。
緑のビューコントローラから、赤のビューコントローラにアンワインド(ナビゲートバック)することができます。Blue からは Green へ、あるいは Green を経由して Red へと巻き戻せます。アンワインドを有効にするには、赤と緑に特別なアクションメソッドを追加する必要があります。
Objective-Cです。
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
スウィフト
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
アクションメソッドを追加した後、ストーリーボードで終了アイコンをコントロールドラッグすることで、巻き戻しセグエを定義することができます。ここでは、ボタンが押されたときに、緑から赤に巻き戻すようにします。
巻き戻し先のビューコントローラーに定義されているアクションを選択する必要があります。
また、BlueからRedに巻き戻すこともできます(ナビゲーションスタックでは、"2歩先"です)。重要なのは、正しいアンワインドアクションを選択することです。
アンワインドセグエが実行される前に、アクションメソッドが呼び出されます。この例では、緑と青の両方から赤へのアンワインドセグを定義しています。UIStoryboardSegueパラメータを使用して、アクションメソッド内のアンワインドソースにアクセスすることができます。
Objective-Cです。
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
UIViewController* sourceViewController = unwindSegue.sourceViewController;
if ([sourceViewController isKindOfClass:[BlueViewController class]])
{
NSLog(@"Coming from BLUE!");
}
else if ([sourceViewController isKindOfClass:[GreenViewController class]])
{
NSLog(@"Coming from GREEN!");
}
}
スウィフト
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
println("Coming from BLUE")
}
else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
println("Coming from RED")
}
}
巻き戻しは、プッシュ/モーダルセグメンテーションの組み合わせでも機能します。例えば、モーダルセグエで別の黄色のビューコントローラを追加した場合、黄色から赤に戻るまで一度に巻き戻すことができます。
コードから紐解く
ビューコントローラの終了シンボルに何かをコントロールドラッグして巻き戻しセグエを定義すると、ドキュメントアウトラインに新しいセグエが表示されます。
セグエを選択して、属性インスペクタを表示すると、"Identifier" プロパティが表示されます。これを利用して、セグエに一意な識別子をつけてください。
この後、他のセグエと同じようにコードからアンワインドセグエを実行することができます。
Objective-Cです。
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
スウィフト
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
関連
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] Xcode 6.3 - 現在の iOS Development 証明書または保留中の証明書要求がすでにあります。
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
制御が非ボイド関数の終了に達する
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] Objective-CでNSNotificationCenterを通してメッセージを送受信する?
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み】プログラム上でセグエの巻き戻しを行うには?
-
[解決済み】Swiftで前のViewControllerにプログラム的に戻る