У меня есть подкласс 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()
сработает в обоих случаях, но это не так.
Я ценю, что код презентации может потребоваться адаптация для наиболее правильного подхода как к презентации, так и к увольнению.