Чистый просмотр контроллера увольнение на iPhone и iPad - PullRequest
1 голос
/ 04 апреля 2019

У меня есть подкласс UIViewController для редактирования деталей объекта, который помещается в UINavigationController на iPhone.

На iPad это корневой контроллер вида в UINavigationController, представленный с presentationStyle из UIModalPresentationPopover. Другими словами, презентация - это толчок на iPhone и модал / поповер на iPad.

Итак, презентация выполняется следующим образом:

iPhone:

self.navigationController.pushViewController(detailVC, animated: true)

IPad:


let nc = UINavigationController(rootViewController: detailVC)
nc.modalPresentationStyle = .popover
self.present(nc, animated: true)

Я пересматриваю код, который отклоняет этот контроллер представления; для этого нужно открыть навигационный стек на iPhone или отключить всплывающее окно на iPad.

На данный момент код выглядит следующим образом:

        if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {
            self.navigationController?.popViewController(animated: true)
        } else {
            self.presentingViewController?.dismiss(animated: true, completion: nil)
        }

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

Существует ли более чистый / не зависящий от устройства / более идиоматичный способ справиться с отказом от этого контроллера представления как на iPhone, так и на iPad ?

Я надеялся и ожидал, что self.presentingViewController?.dismiss() сработает в обоих случаях, но это не так.

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

1 Ответ

1 голос
/ 04 апреля 2019

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

При представлении UIViewController в качестве rootVC UINavigationController, вы можете проверить действия по увольнению

if self.navigationController?.viewControllers.first === self {
    dismiss(animated: true, completion: nil)
} else {
    self.navigationController?.popViewController(animated: true)
}

В качестве альтернативы вы можете иметь 2 действия для обоих случаев

@objc func popAction() {
    self.navigationController?.popViewController(animated: true)
}

@objc func dismissAction() {
    dismiss(animated: true, completion: nil)
}
...