У меня есть пара segues, представляющих контроллеры модального представления.
class ProfileViewController: UIViewController {
func configure(profile: Profile) {
// Some ProfileViewController specific config
}
}
class SettingsViewController: UIViewController {
func configure(settings: Settings) {
// Some SettingsViewController specific config
}
}
Итак, вот некоторый довольно стандартный код, который мы все написали много раз ...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.destination {
case let nav as UINavigationController:
switch nav.topViewController {
case let pvc as ProfileViewController:
pvc.configure(profile: profile)
case let svc as SettingsViewController:
svc.configure(settings: settings)
default:
break
}
default:
break
}
}
Я такжепопробовал это так ...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.destination {
case let nav as UINavigationController
where nav.topViewController is ProfileViewController:
(nav.topViewController as! ProfileViewController).configure(profile: profile)
case let nav as UINavigationController
where nav.topViewController is SettingsViewController:
(nav.topViewController as! SettingsViewController).configure(settings: settings)
default:
break
}
}
Но то, что я хотел бы сделать, - это сочетание двух ...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch segue.destination {
case let nav as UINavigationController
where let pvc = nav.topViewController as ProfileViewController:
pvc.configure(profile: profile)
case let nav as UINavigationController
where let svc = nav.topViewController as SettingsViewController:
svc.configure(settings: settings)
default:
break
}
}
, но, очевидно, это не скомпилируется.Кто-нибудь сталкивался с лучшим шаблоном для этого?
ОБНОВЛЕНИЕ
Расширяя ответ @ Сержа ниже…
extension UIStoryboardSegue {
var destinationNavTopViewController: UIViewController? {
return (destination as? UINavigationController)?.topViewController
}
}
затем
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
switch (segue.destination, destinationNavTopViewController) {
case let (_, pvc as ProfileViewController):
pvc.configure(profile: profile)
case let (_, svc as SettingsViewController):
svc.configure(settings: settings)
case let (ovc as OtherViewController, _):
ovc.configure…
default:
break
}
}