2016-12-26 5 views
1

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

  1. присутствует Первый View Controller Root View Controller модально
  2. Когда я кнопка на первый взгляд контроллера щелкнул, а затем второй View Controller появляется модально над ним.
  3. Как только появился второй контроллер просмотра, я хочу удалить или удалить первый из иерархии представления.

Могу ли я сделать это? Если так, как я должен это делать?

Если нет, то, что это правильный способ решить эту проблему, я представлю множество представленных в режиме просмотра представлений контроллеров по каждому виду. Я думаю, что даже если я хочу отклонить текущий вид, предыдущий будет по-прежнему появляться, когда текущий увольняется.

ОБНОВЛЕНИЕ:

VC1 (корень)> ВК 2 (который присутствовал модально)> ВК 3 (который был настоящий модально над VC 2)

Когда я увольняю VC3, VC2 все еще находится в памяти. Итак, я не хочу появляться VC2, как только я увольняю VC3, и вместо этого хочу увидеть VC1, удалив или отклонив VC2 из иерархии представлений.

enter image description here

ХОЧЕТ: На изображении, когда я распускать синий, я не хочу видеть розовый в моей точке зрения памяти, и я хочу, чтобы удалить его, как только появятся синие один.

Это то, что я хочу.

Любая помощь? Спасибо.

+0

Итак, если я не ошибаюсь, что вы пытаетесь сделать, это представить следующее: vc1-> vc2-> vc3, а при отклонении vc3 вы хотите быть в vc1, правильно? –

+0

Сортировка в порядке .... но вот что я хочу делать. root> vc1> vc2> vc3 и когда я отклоняю vc3, не должно быть vc1 и vc2 в иерархии представления памяти –

+0

Я предполагаю, что корень должен быть vc1 ... –

ответ

4

Итак, давайте предположим, что у вас есть раскадровка похожие на:

enter image description here

Что нужно случается:

  • Представляя второй ViewController (от первого ViewController).
  • Представление третьего ViewController (со второго ViewController).
  • отклоняется до первого ViewController (из третьего ViewController).

в действии кнопки третьего ViewController в:

@IBAction func tapped(_ sender: Any) { 
    presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) 
} 

Как вы можете видеть, путем доступа к presentingViewController текущего ViewController, вы можете отклонить предыдущую иерархию контроллеров отображения:

Контроллер представления, который представил этот контроллер вида.

Реализуя presentingViewController?.presentingViewController?, что означает, что: представленный представленной текущей ViewController :)

Это может показаться немного запутанным, но это довольно просто.

Так выход должен быть как (я добавил цвета фона к viewControllers его VC1: оранжевый, VC2: черный и VC3: светло-оранжевый, чтобы сделать это четко виден):

enter image description here

EDIT:

Если вы просите, чтобы удалить ViewController (ы) в середине (который в данном примере второй ViewController), dismiss(animated:completion:) делает это автоматически:

Если вы представите несколько контроллеров представлений подряда, таким образом, построение стопки представленных контроллеров просмотреть, назвав этот метод на представлении контроллера ниже в стеке увольняет его непосредственный вид ребенка контроллера и все контроллеры просмотра выше этого ребенок на стек. Когда это произойдет, только самый верхний вид отклоняется в анимированном ; любые контроллеры промежуточного вида просто удаляются из стека . Самый верхний вид отклоняется с использованием модального перехода , который может отличаться от стилей, используемых другими контроллерами представлений ниже в стеке.

Ссылаясь на то, что вы спрашиваете:

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

Я думаю, что появляется явно на UI (и я считаю, это нормально), но, как указано в документации обсуждения dismiss, как третий и второй будет удален из стека. Это правильный путь.

Надеюсь, это помогло.

+1

Я думаю, что это было то же самое, что => self.view.window? .rootViewController? .dismiss (анимированный: true, завершение: ноль). –

+0

Итак, это дало ожидаемый результат? что вы пытаетесь достичь? –

+0

Прошу прощения, что этого не было. Я полностью хочу удалить vc2 из памяти просмотра, и будет vc1> vc3, когда появится vc3. –

1

Вот мое мнение в другом ракурсе,

  1. Root View Controller присутствует Second View Controller
  2. Добавить FirstView на второй вид
  3. Отклонить FirstView Контроллер при нажатии кнопки д.

enter image description here

Second View Controller,

class ViewController: UIViewController, FirstViewControllerProtocol { 

    weak var firstViewController: FirstViewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     print("Not initiated: \(firstViewController)") 

     firstViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController 
     addChildViewController(firstVC!) 
     firstViewController?.delegate = self 
     view.addSubview((firstViewController?.view)!) 

     print("Initiated: \(firstViewController)") 
    } 

    func dismiss() { 
     firstViewController?.view.removeFromSuperview() 
     firstViewController?.removeFromParentViewController() 

    } 
} 

FirstViewController,

protocol FirstViewControllerProtocol { 
    // Use protocol/delegate to communicate within two view controllers 
    func dismiss() 
} 

class FirstViewController: UIViewController { 

    var delegate: FirstViewControllerProtocol? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func dismiss(_ sender: Any) { 
     delegate?.dismiss() 
    } 

    deinit { 
     print("BYE") 
    } 

} 
+0

Я попробую. Благодарю. –

+0

Кроме того, я добавляю несколько сообщений журнала. при увольнении FirstViewController, deinit будет вызываться и освобождать память. – WeiJay

+0

Я действительно не понимаю, что это значит ... Я думаю, что функция @IBAction func должна включать второй vc? Если вы не возражаете, можете ли вы отправить ответ с помощью 3 vc? vc1 (root)> vc2> vc3. Спасибо –

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