2016-11-06 4 views
1

Проблемаразматывает обычая SEGUE не запускается

Моя проблема заключается в том, что процесс размотки не срабатывает, даже если кнопка нажата назад.

Мой код

У меня есть класс 1stViewController, который использует пользовательский SEGUE для 2ndViewController. Обычай переход заключается в следующем:

override func perform() { 
    let sourceVC = self.source as! 1stViewController 
    let destinationVC = self.destination as! 2ndViewController 
    sourceVC.addChildViewController(destinationVC) 
    sourceVC.view.addSubview(destinationVC.view) 
} 

В моей 2ndViewController я добавил кнопку, которая запускает раскручивание SEGUE обратно 1stViewController. Разрывный сегмент подключается через идентификатор выключения режима размотки segue в контроллере 2ndViewController. Таким образом, я создал IBAction, что размотки выход Segue соединено с:

@IBAction func unwindToFeed(segue: UIStoryboardSegue) {} 

Я установил идентификатор размотки Segue, равную той, которая используется в функции действия кнопки

func handleActionBackButton(){ 
    print("here") 
    self.performSegue(withIdentifier: "unwindId", sender: self) 
} 

«Здесь» печатается при нажатии кнопки, но, похоже, функция performSegue отсутствует.

Я догадывался, что мне нужен собственный unwindSegue класс, так что я создал unwindSegueEventToFeed:

class unwindSegueEventToFeed: UIStoryboardSegue { 

override func perform() { 
    let sourceVC = self.source as! 2ndViewController 
    let destinationVC = self.destination as! 1stViewController 

    let sourceView = sourceVC.view as UIView! 
    let destView = destinationVC.view as UIView! 

    let window = UIApplication.shared.keyWindow 
    window?.insertSubview(destView!, aboveSubview: sourceView!) 
    sourceVC.dismiss(animated: false, completion: nil) 
} 

} ... который называется в 2ndViewController:

override func segueForUnwinding(to toViewController: UIViewController, from fromViewController: UIViewController, identifier: String?) -> UIStoryboardSegue? { 
    return unwindSegueEventToFeed(identifier: identifier, source: fromViewController, destination: toViewController) 
} 

Любые подсказки на что я должен делать иначе, чтобы вызвать процесс размотки?

+0

Просто чтобы подтвердить, что 'unwindToFeed' находится в 1Пинике контроля? – Paulw11

+0

The unwindToFeed находится в 2ViewController –

+0

Это не то место.Метод разматывания идет в диспетчере просмотра, который вы разматываете * до * – Paulw11

ответ

1

Я получил ваш пример для работы следующим образом. ViewController - это первый контроллер представления; ViewController2 второй контроллер представления:

class ViewController: UIViewController { 
    @IBAction func unwindToFeed(_ segue: UIStoryboardSegue) { 
     let child = self.childViewControllers[0] 
     child.willMove(toParentViewController: nil) 
     child.view.removeFromSuperview() 
     child.removeFromParentViewController() 
    } 
} 

class MySegue: UIStoryboardSegue { 
    override func perform() { 
     let sourceVC = self.source as! ViewController 
     let destinationVC = self.destination as! ViewController2 
     sourceVC.addChildViewController(destinationVC) 
     sourceVC.view.addSubview(destinationVC.view) 
     destinationVC.view.frame = sourceVC.view.bounds 
     destinationVC.view.autoresizingMask = [.flexibleHeight, .flexibleWidth] 
     destinationVC.didMove(toParentViewController: sourceVC) 
    } 
} 

class ViewController2 : UIViewController { 
} 

Обратите внимание, что unwindToFeed является (и должен быть) в контроллере представления первый. Бесполезно помещать его во второй контроллер представления, так как вторым регулятором просмотра является источник , а не адресат, от размотки.

Теперь я хотел бы сделать несколько замечаний по поводу этой проблемы и мой ответ:

  • Это IOS 10 примеров. segueForUnwinding будет никогда не будет в iOS 10; он был оставлен после iOS 8 и впоследствии устарел.

  • iOS 9/10 эквивалент segueForUnwinding является unwind(for:towardsViewController:). Я попытался реализовать его, но обнаружил, что он был вызван в ViewController2, а не в ViewController. Я рассматриваю это как ошибку в iOS 10 и сообщаю об этом Apple.

+0

Но мой пример вообще не работает в iOS 9. В целом все понятие использования разворачиваемых сегментов с настраиваемым родительским контроллером представления все еще выглядит очень сломанным, как это было в течение многих лет, и я предлагаю избегать его полностью. – matt

Смежные вопросы