DetailViewController UISplitViewController равен нулю, если для параметра overrideUserInterfaceStyle установлено значени ⇐ IOS
DetailViewController UISplitViewController равен нулю, если для параметра overrideUserInterfaceStyle установлено значени
У меня есть UISplitViewController с двумя UINavigationControllers в качестве основного и подробного контроллеров представления, созданный с помощью Storyboard. Основной элемент имеет статический UITableViewController, и нажатие на строку приведет к загрузке подробного представления в навигационный контроллер подробного представления.
Все работает как положено, за исключением случая, когда я установил для overrideUserInterfaceStyle «темный режим». Когда это будет сделано, массив viewControllers UISplitViewController будет содержать только один элемент — основной контроллер представления.
Я попытался воссоздать проблему на упрощенном примере, и мне удалось воспроизвести проблему.
Воспроизводимый тестовый пример находится по адресу https://github.com/sridharrajagopal/TestApp
протокол RootSettingsViewControllerSelectionDelegate : AnyObject { функция viewControllerSelected (_ vc: String) } класс RootSettingsViewController: UITableViewController, MFMailComposeViewControllerDelegate { слабый делегат var: RootSettingsViewControllerSelectionDelegate? переопределить функцию viewDidLoad() { супер.viewDidLoad() if (UIDevice.current.userInterfaceIdiom == .pad) { пусть indexPath = IndexPath (строка: 0, раздел: 0) tableView.selectRow(at: indexPath, анимированный: true, ScrollPosition: UITableView.ScrollPosition.top) tableView.delegate?.tableView!(tableView, DidSelectRowAt: indexPath) } } переопределить func tableView (_ tableView: UITableView, DidSelectRowAt indexPath: IndexPath) { if (indexPath.section == 2 && indexPath.row == 2) { // Свяжитесь с нами по электронной почте() } else if (indexPath.section == 0 && indexPath.row == 0) { делегат?.viewControllerSelected("A") } else if (indexPath.section == 0 && indexPath.row == 1) { делегат?.viewControllerSelected("B") } else if (indexPath.section == 0 && indexPath.row == 2) { делегат?.viewControllerSelected("C") } если позволить DetailViewController = делегировать как? SettingsSecondaryNavigationViewController { SplitViewController?.showDetailViewController(detailViewController, отправитель: ноль) } } } класс SettingsSecondaryNavigationViewController: UINavigationController { переопределить init (nibName nibNameOrNil: String?, Bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, пакет: nibBundleOrNil) } требуется инициализация?(кодер aDecoder: NSCoder) { super.init(кодер: aDecoder) } переопределить функцию viewDidLoad() { супер.viewDidLoad() } } расширение SettingsSecondaryNavigationViewController: RootSettingsViewControllerSelectionDelegate { func viewControllerSelected (_ vc: String) { если (vc == "A") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .red self.viewControllers = [detailViewController] } иначе если (vc == "B") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .green self.viewControllers = [detailViewController] } еще если (vc == "C") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .blue self.viewControllers = [detailViewController] } иначе если (vc == "D") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .purple self.viewControllers = [detailViewController] } } } класс SettingsSplitViewController: UISplitViewController, UISplitViewControllerDelegate { переопределить функцию viewDidLoad() { супер.viewDidLoad() делегат = сам пусть DetailViewController = (self.viewControllers.last как? SettingsSecondaryNavigationViewController) пусть PrimaryViewController = (self.viewControllers.first как? UINavigationController)? .topViewController как? РутНастройкивиевконтроллер // Здесь он проваливается, поскольку DetailViewController равен нулю PrimaryViewController!.Delegate = DetailViewController! привилегированныйDisplayMode = UISplitViewController.DisplayMode.oneBesideSecondary } функция SplitViewController( _ SplitViewController: UISplitViewController, коллапсSecondaryвторичныйViewController: UIViewController, на PrimaryViewController: UIViewController ) -> Бул { вернуть истину } } Я сейчас в полном замешательстве. Если overrideUserInterfaceStyle имеет значение .light или .unspecified (соответствует системным настройкам), все работает нормально.
Я вижу, что при загрузке приложения viewDidLoad SettingsSecondaryNavigationViewController вызывается, когда overrideUserInterfaceStyle имеет значение .light или .unspecified (даже до загрузки фактического UISplitViewController, но не вызывается в режиме .dark).
Мой первый вопрос: нормально ли то, что я делаю, или есть какие-то внутренние проблемы, которые проявляются в виде проблемы с «темным режимом».
Будем очень признательны за любую информацию или подсказки!
У меня есть UISplitViewController с двумя UINavigationControllers в качестве основного и подробного контроллеров представления, созданный с помощью Storyboard. Основной элемент имеет статический UITableViewController, и нажатие на строку приведет к загрузке подробного представления в навигационный контроллер подробного представления.
Все работает как положено, за исключением случая, когда я установил для overrideUserInterfaceStyle «темный режим». Когда это будет сделано, массив viewControllers UISplitViewController будет содержать только один элемент — основной контроллер представления.
Я попытался воссоздать проблему на упрощенном примере, и мне удалось воспроизвести проблему.
Воспроизводимый тестовый пример находится по адресу https://github.com/sridharrajagopal/TestApp
протокол RootSettingsViewControllerSelectionDelegate : AnyObject { функция viewControllerSelected (_ vc: String) } класс RootSettingsViewController: UITableViewController, MFMailComposeViewControllerDelegate { слабый делегат var: RootSettingsViewControllerSelectionDelegate? переопределить функцию viewDidLoad() { супер.viewDidLoad() if (UIDevice.current.userInterfaceIdiom == .pad) { пусть indexPath = IndexPath (строка: 0, раздел: 0) tableView.selectRow(at: indexPath, анимированный: true, ScrollPosition: UITableView.ScrollPosition.top) tableView.delegate?.tableView!(tableView, DidSelectRowAt: indexPath) } } переопределить func tableView (_ tableView: UITableView, DidSelectRowAt indexPath: IndexPath) { if (indexPath.section == 2 && indexPath.row == 2) { // Свяжитесь с нами по электронной почте() } else if (indexPath.section == 0 && indexPath.row == 0) { делегат?.viewControllerSelected("A") } else if (indexPath.section == 0 && indexPath.row == 1) { делегат?.viewControllerSelected("B") } else if (indexPath.section == 0 && indexPath.row == 2) { делегат?.viewControllerSelected("C") } если позволить DetailViewController = делегировать как? SettingsSecondaryNavigationViewController { SplitViewController?.showDetailViewController(detailViewController, отправитель: ноль) } } } класс SettingsSecondaryNavigationViewController: UINavigationController { переопределить init (nibName nibNameOrNil: String?, Bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, пакет: nibBundleOrNil) } требуется инициализация?(кодер aDecoder: NSCoder) { super.init(кодер: aDecoder) } переопределить функцию viewDidLoad() { супер.viewDidLoad() } } расширение SettingsSecondaryNavigationViewController: RootSettingsViewControllerSelectionDelegate { func viewControllerSelected (_ vc: String) { если (vc == "A") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .red self.viewControllers = [detailViewController] } иначе если (vc == "B") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .green self.viewControllers = [detailViewController] } еще если (vc == "C") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .blue self.viewControllers = [detailViewController] } иначе если (vc == "D") { пусть DetailViewController = UIViewController() DetailViewController.view.backgroundColor = .purple self.viewControllers = [detailViewController] } } } класс SettingsSplitViewController: UISplitViewController, UISplitViewControllerDelegate { переопределить функцию viewDidLoad() { супер.viewDidLoad() делегат = сам пусть DetailViewController = (self.viewControllers.last как? SettingsSecondaryNavigationViewController) пусть PrimaryViewController = (self.viewControllers.first как? UINavigationController)? .topViewController как? РутНастройкивиевконтроллер // Здесь он проваливается, поскольку DetailViewController равен нулю PrimaryViewController!.Delegate = DetailViewController! привилегированныйDisplayMode = UISplitViewController.DisplayMode.oneBesideSecondary } функция SplitViewController( _ SplitViewController: UISplitViewController, коллапсSecondaryвторичныйViewController: UIViewController, на PrimaryViewController: UIViewController ) -> Бул { вернуть истину } } Я сейчас в полном замешательстве. Если overrideUserInterfaceStyle имеет значение .light или .unspecified (соответствует системным настройкам), все работает нормально.
Я вижу, что при загрузке приложения viewDidLoad SettingsSecondaryNavigationViewController вызывается, когда overrideUserInterfaceStyle имеет значение .light или .unspecified (даже до загрузки фактического UISplitViewController, но не вызывается в режиме .dark).
Мой первый вопрос: нормально ли то, что я делаю, или есть какие-то внутренние проблемы, которые проявляются в виде проблемы с «темным режимом».
Будем очень признательны за любую информацию или подсказки!
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение