swift - 显示推送通知横幅,无论用户在应用中

时间:2016-12-15 16:34:26

标签: uiviewcontroller swift3

当用户获得推送通知时,无论用户当前正在查看哪个视图控制器,我都试图展示横幅广告。

我能想到的最具扩展性的方法是创建一个类似于此的BannerController

 if let window = UIApplication.shared.keyWindow {


                window.addSubview(bannerView)
            }

所以我会在每个视图控制器中创建一个BannerController对象,并订阅成为它的委托。

然后,当用户收到推送通知时...向我的BannerController发布通知,然后委托显示该动作的操作。

这似乎并不完美,因为我必须在每个视图控制器中创建一个BannerController对象,我想在其中显示...任何想法?

2 个答案:

答案 0 :(得分:0)

您可以遍历所呈现的视图控制器,然后在顶部视图控制器上显示模态视图控制器。

let alert = UIAlertController(
    title: "Alert", 
    message: "Message", 
    preferredStyle: .alert
)
alert.addAction(UIAlertAction(...))

if let window = window, var currentVC = window.rootViewController {
    while currentVC.presentedViewController != nil
        currentVC = currentVC.presentedViewController!
    }
    currentVC.present(alert, animated: true)
}

在这个示例中,我使用的是UIAlertController,但您可以将其切换为与警报描述相匹配的内容。有很多开源的(https://github.com/bryx-inc/BRYXBanner),或者你可以编写自己的。

答案 1 :(得分:0)

我遇到了类似的问题并为其创建了自己的库:MDNotificationView

它使用您的方法在所有视图之上显示横幅。您也可以直接从AppDelegate执行此操作。

let view = MDNotificationExpandedImageLayoutView()
view.imageView.image = UIImage(named: "Face")      
view.titleLabel.text = "New message from someone"
view.textLabel.text = "Hello."

// You can pass any UIView here.
let notificationView = MDNotificationView(view: view)
notificationView.delegate = self
notificationView.show()

// MARK: - Notification View Delegate

func notificationDidShow(notificationView: MDNotificationView) {
    // Hide the notification view automatically after 5 seconds.
    DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
        notificationView.hide()
    }
}

随意借用代码或提问。