Вставьте UIView поверх других представлений программно - PullRequest
0 голосов
/ 28 мая 2018

Я работаю над приложением для iOS, и мне нужно, чтобы в каждом контроллере uiview появлялось отображение uiview, когда нет доступного подключения к Интернету, как в мессенджере facebook, я пишу следующий код для этого:

 extension UIViewController: NetworkStatusListener {

        public func networkStatusDidChange(status: Reachability.NetworkStatus) {

            switch status {
            case .notReachable:
                debugPrint("ViewController: Network became unreachable")
            case .reachableViaWiFi:
                debugPrint("ViewController: Network reachable through WiFi")
            case .reachableViaWWAN:
                debugPrint("ViewController: Network reachable through Cellular Data")
            }

            let headerView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 30))
            let headerLbl = UILabel()
            headerLbl.frame = CGRect(x: 0, y: 0, width:  self.view.frame.size.width, height: 30)
            headerLbl.text = "No Internet Connection!"
            headerLbl.backgroundColor = UIColor.red
            headerLbl.font = UIFont(name: "Cairo", size: 14)
            headerLbl.textAlignment = .center
            headerView.addSubview(headerLbl)

           //
            self.view.insertSubview(headerView, at: 0)

            headerView.isHidden = (status == .notReachable)
        }
      override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        ReachabilityManager.shared.addListener(listener: self)
    }

      override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        ReachabilityManager.shared.removeListener(listener: self)
    }

}

Я проверяю доступность сети на this
Проверка сети работает правильно, но желаемая цель не достигнута.Мне не нужно, чтобы сетевое соединение появлялось в каждом контроллере uiview моего проекта, когда нет подключения к Интернету, и в верхней части всех других представлений без перекрытия других или над ними, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

пара вещей ...

Во-первых, в вашем методе networkStatusDidChange вы создаете новый headerView каждый раз - независимо от состояния доступности сети.Возможно, вы захотите: а) создать headerView только тогда, когда вы действительно хотите показать его;и б) создайте его, только если вы этого еще не сделали.

Во-вторых, я уверен, что вставка представления с индексом 0 помещает его внизу.Вместо этого вы можете просто addSubview в первый раз, а затем позвонить bringSubview(toFront:) на него, когда вы захотите показать его снова.

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

Если это имеет смысл для вашего приложения, вытакже может создать выделенный подкласс UIViewController для отображения статуса (вместо расширения, к которому может иметь доступ любой контроллер представления ).Затем настройте иерархию контроллера представления в своем приложении - например, если ваше приложение является приложением панели вкладок:

AppRootViewController
    YourTabBarController
    YourNetworkStatusViewController

Net status vc может добавлять / удалять свое представление по мере необходимости в ответ на работу сетиизменения доступности.Преимущество заключается в разделении интересов - только один VC знает о показе состояния сети, а все остальные ваши контроллеры представления остаются независимыми от него.

0 голосов
/ 28 мая 2018

Я бы предпочел расширение сообщения, например SwiftMessages .Вы можете легко вызвать функцию из любого класса / функции, например, из вашей функции доступности сети.

в вашем случае это выглядело бы так:

public func networkStatusDidChange(status: Reachability.NetworkStatus) {

        switch status {
        case .notReachable:
            debugPrint("ViewController: Network became unreachable")
            let view = MessageView.viewFromNib(layout: .cardView)
            view.configureTheme(.warning)
            view.configureDropShadow()
            view.configureContent(title: "Warning", body: "Network became unreachable.")
            SwiftMessages.show(view: view)
        case .reachableViaWiFi:
            debugPrint("ViewController: Network reachable through WiFi")
        case .reachableViaWWAN:
            debugPrint("ViewController: Network reachable through Cellular Data")
        }
    }

Для таблиц вы можете использовать некоторыеСтручки, как это: https://github.com/HamzaGhazouani/HGPlaceholders или https://github.com/dzenbot/DZNEmptyDataSet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...