IOS 7で正常に動作するアプリがありますが、iOS 8用に構築した場合、アンワインドセグエは機能しません。
新しいプロジェクトを作成し、モーダル(tableviewcontrollerを備えたナビゲーションコントローラー)を追加し、アンワインドモーダルを使用しようとしました。残念ながら、それも機能しません。巻き戻されているメソッドは、Desination View Controllerにあります。巻き戻しセグエは、ストーリーボード(tableviewcontrollerのNavigationbarボタン)を介して作成されます。ボタンをタップしても、何も起こりません。ログ出力はなく、モーダルは消えません。また、モーダルセグエにのみ影響するようです。プッシュ/ポップオーバーは、通常はほどかれます。
誰かが同様の問題を抱えていて、それをどのように解決できるかというアイデアを持っていますか?
AppleはiOS 8.1でこのバグを修正しました
iOS 8.0の一時的なソリューション
巻き戻しセグエは、次の状況でのみ機能しません。
ビュー構造:ITabBarController-> INagivationController-> IViewController1-> IViewController2
通常(iOS 7、8.1)、IViewController2からIViewController1に巻き戻すと、viewControllerForUnwindSegueAction in IViewController1を呼び出します。
ただし、iOS 8.0および8.0.xでは、IViewController1ではなくITabBarControllerのviewControllerForUnwindSegueActionを呼び出すため、アンワインドセグエが機能しなくなります。
ソリューション:オーバーライドviewControllerForUnwindSegueAction in ITabBarControllerカスタムを作成するITabBarControllerを使用して、カスタムを使用します。
Swiftの場合
CustomTabBarController.Swift
import UIKit
class CustomTabBarController: UITabBarController {
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
var resultVC = self.selectedViewController?.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
return resultVC
}
}
古い学校のObjective-Cの場合
CustomTabBarController.h
#import <UIKit/UIKit.h>
@interface CustomTabBarController : UITabBarController
@end
CustomTabBarController.m
#import "CustomTabBarController.h"
@interface CustomTabBarController ()
@end
@implementation CustomTabBarController
-(UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
return [self.selectedViewController viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
@end
================================================== ============================
このポイントより下のソリューションは使用しないでください(これらは古くなっており、参照用です)
9月23日の最新更新
私の新しいソリューションは、Navigation Controllerに埋め込まれたビューにプッシュし、Push(IBのチェックボックス)の下のバーを隠すようにそのNavigation Controllerを設定します。その後、ビューはモーダルビューのようになります。唯一の違いは、プッシュとポップのアニメーションです。必要に応じてカスタマイズできます
更新:以下のソリューションは、実際にモーダルビューをタブバーの下に表示します。これにより、ビューレイアウトの問題がさらに発生します。
セグエタイプをPresent As Popoverにのみ変更しますiOS8 for iPhones、iOS7ではアプリがクラッシュします 。
ここでも同じ、これを修正するために、セグエのプレゼンテーションを現在のコンテキストに設定します(私のアプリはiPhone専用です)。
デフォルトおよびフルスクリーンは機能しません。
[[〜#〜] update [〜#〜]:iOS 8.1ベータ版で修正されたバグですが、8.0および8.0.2のサポートに必要です]
セグエを解く唯一の方法は、Adityaとviirusの答えを混ぜることです。
私のセットアップ:[View Controller 1]>カスタムモーダルセグエ> [Navigation Controller]> root> [View Controller 2]
巻き戻し:[View Controller 2]>カスタム巻き戻しセグエ> [View Controller 1]
修正:[Navigation Controller]をサブクラス化し、sourceViewControllerというプロパティを追加し、[View Controller 1]から[Navigation Controller]に移動するときにセグエの準備が呼び出されると、そのプロパティに「self」を渡します。
[Navigation Controller]サブクラス.mで、次の2つのメソッドをオーバーライド/追加します。
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
if ([self.sourceViewController canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender]) {
return self.sourceViewController;
}
return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
次に、[Navigation Controller]サブクラスでこれをオーバーライドします。カスタムアンワインドセグエがあるためです。
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [fromViewController segueForUnwindingToViewController:toViewController
fromViewController:fromViewController
identifier:identifier];
}
これは、iOS 8.0、8.0.1、および8.0.2の問題です。 8.1で解決されました。巻き戻しセグエが適切なメソッドを呼び出しています。
IOS 8では、iOS 7と異なり、アンワインドセグエの実行時にモーダル表示されたView Controllerが自動的に却下されない場合があることに注意してください。これらの不整合はiOS 9.0で解決されました。
IOS 8.4をiPhoneで実行すると、すべての表示スタイルのモーダル表示されたセグエはすべて、オーバーフルスクリーンとオーバーカレントコンテキストを除き、巻き戻し時に消えます。 iPadの場合も同様です。フォームシートとページシートの追加も自動的に却下されません。 iOS 9では、すべてのプレゼンテーションスタイルがiPhoneとiPadの両方で自動的に閉じられます。
うん、それは私にも起こります。あなたの場合、UINavigationControllerをサブクラス化し、以下をオーバーライドする必要があると思います。
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
for(UIViewController *vc in self.viewControllers){
// Always use -canPerformUnwindSegueAction:fromViewController:withSender:
// to determine if a view controller wants to handle an unwind action.
if ([vc canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender])
return vc;
}
return [super viewControllerForUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
}
わあ! iOS 8.1.1(iPad 3上)のモーダルビューで立ち往生しているというユーザーレポートがまだあります。
私はこのすべてを、モーダルビューのものから放棄しています。ただ古き良き...
[self dismissViewControllerAnimated:NO completion:nil];
...これらのさまざまなiOS 8.x.xバージョンすべてで正常に動作します。
IOS 7.1とiOS 8.1/8.2の両方がNavigation Controllerからアンワインドセグエを作成しているようですが、アンワインドセグエはNavigation Controller内の子コントローラーに登録されています。
したがって、ストーリーボードに登録されているコントローラーからアンワインドセグエを手動で作成すると、問題が解決します。
@implementation RootNavigationController
- (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}
@end
ここで同じ問題。 Unwindメソッドは呼び出されません。ときにのみ発生します
IOS8でも発生しますGMシード、したがって、回避策を見つける必要があると思います。私にはバグのように聞こえます...
UINavigationControllerの拡張とviewControllerForUnwindSegueActionの実装は、起動されないため、助けにはなりませんでした。起動されるのは、拡張UINavigationController内のcanPerformUnwindSegueAction()のみです。奇妙な。
デスティネーションView ControllerからソースView Controllerに巻き戻すときに同じ問題が発生しました。宛先は、ソースからの「ショー」セグエを通じて提示されました。私は、iPhone 6、iOS8.3を表示するiPhoneシミュレーターを使用していました。 XCode 6.3.2
NavigationViewControllerをサブクラス化するソリューションは、私にとってはうまくいきました。 Swift=本質的にSwiftラウルの答えの翻訳です。私はApple RaulごとのiOS8.1では、8.3でどのようにヒットしますか。
var sourceViewController: UIViewController?
override func viewControllerForUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject?) -> UIViewController? {
if(self.sourceViewController! .canPerformUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender!)){
return self.sourceViewController
}
return super.viewControllerForUnwindSegueAction(action, fromViewController: fromViewController, withSender: sender)
}
私はこの問題に遭遇しましたが、いくつかの掘り下げがモーダルセグエ(少なくともデフォルトおよびフルスクリーンプレゼンテーションモードの場合)で発見された後、通常の巻き戻しメカニズムに頼ることはできませんが、提示されたUIViewControllerのdismissViewControllerAnimatedを呼び出す必要があります方法。