Unwind Segue не работает в iOS 8

У меня есть приложение, которое отлично работает под iOS 7, но при построении для iOS 8 разматывание не работает.

Я создал новый проект и добавил модальный (навигационный контроллер с помощью tableviewcontroller) и попытался использовать мода для разматывания. К сожалению, это тоже не работает. Методы, которые разматываются, находятся в контроллере представления зрения. Развертка segue создается через раскадровку (кнопка Navigationbar в контроллере tableview). Когда я нажимаю кнопку, ничего не происходит. Нет выхода журнала, и модальность не исчезает. Это также, по-видимому, влияет на модальные сегменты. push/popover обычно разматываются.

У кого-то была аналогичная проблема и есть идея, как я мог ее решить?

Ответ 1

Apple установила эту ошибку в iOS 8.1

Временные решения для iOS 8.0

Режим размотки не будет работать только в следующей ситуации:

     
  

Структура представления: UITabBarController UINagivationController UIViewController1 UIViewController2

         

Обычно (в iOS 7, 8.1), когда отключается от UIViewController2 до UIViewController1, он вызывает viewControllerForUnwindSegueAction в UIViewController1.

         

Однако в iOS 8.0 и 8.0.x он будет вызывать viewControllerForUnwindSegueAction в UITabBarController вместо UIViewController1, поэтому перестать разыгрывать больше работа.

  
  

Решение: переопределить viewControllerForUnwindSegueAction в UITabBarController, создав пользовательский UITabBarController и использовать пользовательский. p >

Для 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

=============================================== ===============================

НЕ ИСПОЛЬЗУЙТЕ ЛЮБЫЕ РЕШЕНИЯ НИЖЕ ЭТОЙ ТОЧКИ (они устарели и только для справки)

Последнее обновление от 23 сентября

Мое новое решение приближается к представлению, встроенному в контроллер навигации, и настраивает навигационный контроллер, чтобы скрыть нижнюю панель при нажатии (галочка в IB). Тогда у вас будет вид, похожий на модальный вид, единственное отличие - это оживление нажатия и выскакивания. Вы можете настраивать, если хотите

Обновлено. В приведенном ниже решении действительно присутствует модальный вид под вкладкой вкладки, что приведет к дальнейшим проблемам макета представления.

Измените тип segue на Present As Popover будет работать только на iOS8 для iPhones, на iOS7, которое приведет к сбою вашего приложения.

То же самое, чтобы исправить это, я установил презентацию segue в текущий контекст (мое приложение предназначено только для iphone).

По умолчанию и полный экран не будут работать.

enter image description here

Ответ 2

[ ОБНОВЛЕНИЕ: ошибка была исправлена ​​на бета-версии iOS 8.1, но вам понадобится поддержка 8.0 и 8.0.2]

Единственный способ, которым я мог бы выполнить мою работу, заключался в смешении ответов Aditya и viirus.

Моя настройка: [View Controller 1] > custom modal segue > [Контроллер навигации] > root > [View Controller 2]

разматывает: [View Controller 2] > custom unwind segue > [View Controller 1]

Fix: Подкласс [Контроллер навигации] добавляет свойство sourceViewController и передает "self" этому свойству при подготовке к segue вызывается при переходе с [View Controller 1] на [Navigation Controller]

В подклассе [Navigation Controller].m переопределить/добавить эти два метода:

- (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];
}

Ответ 3

Это проблема с iOS 8.0, 8.0.1 и 8.0.2. Это было решено в 8.1; unind segues теперь вызывают соответствующий метод.

Обратите внимание, что в iOS 8 модально представленные контроллеры представлений не могут автоматически увольняться при выполнении разматывания, в отличие от iOS 7. Чтобы обеспечить его всегда увольнение, вы можете обнаружить, будет ли он уволен, а если нет, то вручную его отклоните. Эти несоответствия разрешены в iOS 9.0.

С iOS 8.4, работающим на iPhone, все модально представленные segues со всеми стилями презентации увольняются после разговора, кроме Over Full Screen и Over Current Context. Это также относится к iPad, с добавлением листа формы и листа страницы, а также не для автоматического отклонения. С iOS 9 все стили презентации автоматически отключаются как на iPhone, так и на iPad.

Ответ 4

Да, это со мной тоже случается, я думаю, что для вашего случая вам нужно подклассифицировать 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];
    }

Ответ 5

Такая же проблема. Метод размотки не вызывается. Только когда

  • с использованием модального сегмента
  • Презентация - это ничего, кроме "текущего контекста"
  • NavigationController не расширен (используется по умолчанию из раскадровки)

Также происходит в IOS8 GM Seed, поэтому я думаю, нам нужно найти обходное решение. Звучит как ошибка для меня...

Расширение UINavigationController и реализация viewControllerForUnwindSegueAction не помогли, так как он не был запущен. Единственное, что увольняется, это canPerformUnwindSegueAction() в расширенном UINavigationController. Странно.

Ответ 6

Вот там! Я все еще получаю отчеты пользователей о том, как застрять на модальном представлении в iOS 8.1.1 (на iPad 3).

Я отключаю все это от модального вида. Просто хороший старомодный...

[self dismissViewControllerAnimated:NO completion:nil];

... отлично работает на всех этих версиях iOS 8.x.x.

Ответ 7

Кажется, что как iOS 7.1, так и iOS 8.1/8.2 создают разматывание от навигационного контроллера, однако разматывание segue зарегистрировано на дочернем контроллере внутри контроллера навигации.

Таким образом, вручную создавая раскручивание от контроллера, где он зарегистрирован в раскадровке, решает проблему.

@implementation RootNavigationController

- (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
    return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}

@end

Ответ 8

Я столкнулся с той же проблемой при разматывании с контроллером представления источника с контроллера представления назначения. Место назначения было представлено через "шоу" из источника. Я использовал симулятор iPhone, который показывает iPhone 6, iOS8.3. XCode 6.3.2

Решение подкласса NavigationViewController работало для меня. Вот быстрый код, который является по существу быстрым переводом ответа Рауля. Я озадачен тем, что, если Apple исправила его в 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)
    }

Ответ 9

Я просто столкнулся с этой проблемой, и после некоторого рытья обнаружил, что с модальными сегментами (по крайней мере, с режимами по умолчанию и полноэкранного представления) вы не можете полагаться на механизм нормального размотки, но вам нужно позвонить представлен метод UIViewController rejectViewControllerAnimated.

Ответ 10

Шаги, которые необходимо соблюдать:

  • Свяжите раскручивающийся сегмент с кнопкой в ​​раскадровке.
  • Создайте IBAction для кнопки и добавьте в нее код ниже:

    [self dismissViewControllerAnimated:NO completion:nil];
    

Это должно работать для всех версий.