Swift: Это плохая практика, чтобы получить доступ к окну AppDelegate, чтобы получить суперпредставление любого представления? - PullRequest
0 голосов
/ 14 января 2020

У меня есть класс, который должен отображать пользовательский баннер уведомлений, чтобы сообщить пользователю, например, успешно ли выполнен вызов API. В настоящее время, если вы хотите использовать этот класс, вы должны передать SuperView, чтобы баннер отображался в правом окне. Я хочу упростить его, создав переменную с именем private let appWindow: UIWindow = UIApplication.shared.delegate!.window!! в классе баннера уведомлений, чтобы разработчику не приходилось думать о том, какой вид является супер-представлением. Затем в классе баннеров уведомлений я установил ограничения баннера, используя appWindow в качестве View.

По сути, я хочу всегда отображать баннер поверх всех остальных View независимо от того, является ли это контроллером панели вкладок, контроллером навигации или любым другим типом View, не зная или не передавая представление. Баннер сам по себе UIView.

Это нормально, если я использую переменную выше? Это хорошая практика? Есть ли лучший способ, чтобы всегда получать самый верхний вид или супер-вид? Если нет, есть ли лучший способ написать переменную выше?

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 14 января 2020

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

  private lazy var bannerWindow = {
    let bannerWindow = UIWindow()
    bannerWindow.backgroundColor = .clear
    bannerWindow.windowLevel = .init(.greatestFiniteMagnitude)
    bannerWindow.isHidden = true
    return bannerWindow
  }
0 голосов
/ 14 января 2020
private let appWindow: UIWindow = UIApplication.shared.delegate!.window!!

Вы не можете предполагать, что у делегата приложения есть свойство окна. Если этого не произойдет, вы просто взбеситесь sh. Вместо этого спросите само приложение о windows.

...