web-dev-qa-db-ja.com

iOS 8で動作しないセグエをほどく

IOS 7で正常に動作するアプリがありますが、iOS 8用に構築した場合、アンワインドセグエは機能しません。

新しいプロジェクトを作成し、モーダル(tableviewcontrollerを備えたナビゲーションコントローラー)を追加し、アンワインドモーダルを使用しようとしました。残念ながら、それも機能しません。巻き戻されているメソッドは、Desination View Controllerにあります。巻き戻しセグエは、ストーリーボード(tableviewcontrollerのNavigationbarボタン)を介して作成されます。ボタンをタップしても、何も起こりません。ログ出力はなく、モーダルは消えません。また、モーダルセグエにのみ影響するようです。プッシュ/ポップオーバーは、通常はほどかれます。

誰かが同様の問題を抱えていて、それをどのように解決できるかというアイデアを持っていますか?

66
viirus

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ではなくITabBarControllerviewControllerForUnwindSegueActionを呼び出すため、アンワインドセグエが機能しなくなります。

ソリューション:オーバーライド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 iPhonesiOS7ではアプリがクラッシュします

ここでも同じ、これを修正するために、セグエのプレゼンテーションを現在のコンテキストに設定します(私のアプリはiPhone専用です)。

デフォルトおよびフルスクリーンは機能しません。

enter image description here

60
Stewart Hou

[[〜#〜] 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];
}
9
Raul Rea

これは、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の両方で自動的に閉じられます。

6
Jordan H

うん、それは私にも起こります。あなたの場合、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];
    }
4

わあ! iOS 8.1.1(iPad 3上)のモーダルビューで立ち往生しているというユーザーレポートがまだあります。

私はこのすべてを、モーダルビューのものから放棄しています。ただ古き良き...

[self dismissViewControllerAnimated:NO completion:nil];

...これらのさまざまなiOS 8.x.xバージョンすべてで正常に動作します。

3
Paul Brady

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
3
highmaintenance

ここで同じ問題。 Unwindメソッドは呼び出されません。ときにのみ発生します

  • モーダルセグエの使用
  • プレゼンテーションは「現在のコンテキスト」以外のものです
  • NavigationControllerは拡張されていません(ストーリーボードのデフォルトを使用)

IOS8でも発生しますGMシード、したがって、回避策を見つける必要があると思います。私にはバグのように聞こえます...

UINavigationControllerの拡張とviewControllerForUnwindSegueActionの実装は、起動されないため、助けにはなりませんでした。起動されるのは、拡張UINavigationController内のcanPerformUnwindSegueAction()のみです。奇妙な。

3
Bertl

デスティネーション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)
    }
1

私はこの問題に遭遇しましたが、いくつかの掘り下げがモーダルセグエ(少なくともデフォルトおよびフルスクリーンプレゼンテーションモードの場合)で発見された後、通常の巻き戻しメカニズムに頼ることはできませんが、提示されたUIViewControllerのdismissViewControllerAnimatedを呼び出す必要があります方法。

0
user3483058