以编程方式在其他视图的顶部插入UIView

时间:2018-05-28 15:39:55

标签: ios xcode swift3 reachability

我在iOS应用程序上工作,如果没有可用的互联网连接,我需要在每个uiviewcontroller中显示uiview,如在facebook messenger中,我编写以下代码来执行此操作:

 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上的网络可用性 网络检查工作正常但未达到预期目标。 当没有互联网连接时,我不需要在项目的每个uiviewcontroller中出现网络连接,并且在所有其他视图之上没有重叠,除了它们之外或之外没有重叠,我该怎么办?

2 个答案:

答案 0 :(得分:1)

我更喜欢像SwiftMessages这样的邮件扩展程序。您可以从任何类/功能e轻松调用该功能。 G。你的网络可用性功能。

在你的情况下,它看起来像这样:

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")
        }
    }

对于tableviews,你可以使用这样的一些Pod:https://github.com/HamzaGhazouani/HGPlaceholdershttps://github.com/dzenbot/DZNEmptyDataSet

答案 1 :(得分:1)

有几件事......

首先,在您的networkStatusDidChange方法中,无论网络可用性状态如何,您每次都会创建一个新的headerView。您可能希望a)仅在您想要显示时创建headerView;和b)只有你还没有创建它。

其次,我非常确定在索引0处插入视图会将其置于底部。相反,您可能只是第一次addSubview,然后当您想再次显示时,请在其上调用bringSubview(toFront:)

如果您要求每个VC能够显示状态消息的要求不是太严格,您可能需要考虑替代,我之所以提出这个原因,我不确定这种方法的效果如何创建其他视图/视图控制器 - 即当新视图被推送到导航控制器时状态消息会发生什么,或者用户在您的应用程序中选择另一个选项卡(我不知道您的应用程序,所以我只是提供实施例)。

如果您的应用程序有意义,您还可以创建一个专用的UIViewController子类来显示状态(而不是任何视图控制器可以访问的扩展名)。然后,在您的应用中设置视图控制器层次结构 - 例如,如果您的应用是标签栏应用:

AppRootViewController
    YourTabBarController
    YourNetworkStatusViewController

网络状态vc可以根据需要添加/删除其视图,以响应网络可用性更改。优点是关注点分离 - 只有一个VC知道显示网络状态,而所有其他视图控制器都保持独立。