2015-06-03 6 views
6

Допустим, у меня есть 3 ViewControllers - A, B и C. A показывает B, B показывает C. Затем я хочу вернуться в A, не пройдя (визуально) B (например, кнопка «домой»)). В настоящее время моя проблема заключается в том, что когда я разматываю A, на короткий период времени отображается B (вызываются методы viewWillAppear и т. Д.). Как я могу это решить?Unwind segue - возврат нескольких просмотров

Note1: Приведенный выше пример очень упрощен по сравнению с моим реальным навигационным навигационным деревом приложений, и для меня использование NavigationController в качестве контейнера для всех A, B и C невозможно (или по крайней мере нежелательно). Немногие из причин находятся в середине перехода, есть сложные вставки segues и различные пользовательские изменения (почти все анимированные переходы абсолютно разные) во всех представлениях.

Note2: Я нашел какое-то псевдо-решение с определением пользовательского segue и его использованием в качестве пользовательского Unwind Segue. Это нежелательно, потому что я хочу использовать мои уже сделанные переходные аниматоры.

Любая помощь очень ценится.

ответ

1

Обратите внимание, что это измененный ответ - в ответ на первый комментарий ниже.

У меня есть возможное решение, которое, похоже, работает. Но это может быть неприемлемо. Я не уверен и предлагаю его только для рассмотрения.

3 контроллера вида настроены, как описано в вопросе (вторая красная, чтобы я мог заметить, видно ли это во время размотки).

enter image description here

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

enter image description here

enter image description here

Ниже приведен код для 3 контроллеров представления. Мое исправление - Я использую глобальное логическое значение, называемое unwindCheck, как флаг, который установлен true до размотки, но в остальном false. Если это true, то self.view.hidden = true в viewWillAppear для второго контроллера. т.е. скрытый во время размотки.

Обратите внимание, что я также добавил вторую кнопку на третьем контроллере представления - он вызывает тот же разматывающий сегмент - свойство идентификатора которого установлено "UnwindToFirstSegue". Вторая кнопка не является необходимой частью этого возможного решения.

class FirstViewController: UIViewController { 

    @IBAction func unwindToFirstViewController(segue: UIStoryboardSegue) { 
    } 

    override func viewDidLayoutSubviews() { 
     unwindCheck = false 
    } 
} 

class SecondViewController: UIViewController { 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     if unwindCheck == true { 
      self.view.hidden = true 
     } 
    } 

    @IBAction func unwindToSecondViewController(segue: UIStoryboardSegue) { 
    } 
} 

class ThirdViewController: UIViewController { 

    @IBAction func backToA(sender: AnyObject) { 
     performSegueWithIdentifier("UnwindToFirstSegue", sender: self) 
    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if let identifier = segue.identifier{ 
      switch identifier { 
      case "UnwindToFirstSegue": 
       unwindCheck = true 
      default: 
       break 
      } 
     } 
    } 
} 

идентификатор раскрутку SEGUE можно установить, выбрав его в структуре документа, а затем идти к инспектору Attributes.

+0

Насколько я могу видеть segue от C до A (какой тип находится за B), не разматывайте segue (исправьте меня, если я ошибаюсь). Если то, что я предполагаю, верно, тогда это начнет течь ... ну не совсем утечка, но используя все больше и больше памяти после циклирования A-> B-> C-> A-> B-> C-> A. .. количество копий A, например, в памяти после A-> B-> C-> A, равно 2, что плохо для приложения. Развертка segue фиксирует это, не создавая новый контроллер каждый раз, когда вы переходите к нему, и повторно используете уже созданную копию (не на 100% правильную, но вы получаете точку) – devfreak

+0

Да. Сожалею.В ответ на ваш комментарий я полностью изменил свой ответ. – simons