Я пишу библиотеку UserNotification для повторного использования во многих приложениях. При необходимости приведенный ниже файл .swift просто перетаскивается в новый проект. Затем я добавляю NSObject в View Controller Scene, устанавливая его собственный класс в KTUserNotification. Затем я перетаскиваю выходную ссылку из этого NSObject в контроллер представления. Оттуда я использую этот выход для вызова Show () для отображения уведомлений.
Я использую NSObject с подходом пользовательского класса, потому что экземпляр должен оставаться выделенным, пока приложение не завершится. Сначала я попытался сделать его просто пользовательским классом, используя let usernotification = KTUserNotification (). Это, однако, освобождается до того, как вызов поступил в уведомлении shouldPresent, вызывая EXC_BAD_ACCESS. @IBInspectables были просто хорошим дополнением, которое я добавил, когда переходил к подходу NSObject.
Есть ли другой способ сохранить экземпляр, пока программа не завершится без использования NSObject? О, NSObject - лучший путь сюда?
import Cocoa
class KTUserNotification: NSObject, NSUserNotificationCenterDelegate {
@IBInspectable var showEvenIfAppIsFocus: Bool = true
@IBInspectable var title: String = ""
@IBInspectable var subTitle: String = ""
@IBInspectable var informativeText: String = ""
@IBAction func showNotification(_ sender: Any) {
Show()
}
override func awakeFromNib() {
NSUserNotificationCenter.default.delegate = self
}
func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
return showEvenIfAppIsFocus
}
public func Show(title : String, subTitle: String, informativeText : String) {
let notification = NSUserNotification()
let randIdentifier = Int(arc4random_uniform(999999999) + 1)
notification.identifier = "KTUserNotification\(randIdentifier)"
notification.title = title
notification.subtitle = subTitle
notification.informativeText = informativeText
notification.soundName = NSUserNotificationDefaultSoundName
let notificationCenter = NSUserNotificationCenter.default
notificationCenter.deliver(notification)
}
public func Show() {
Show(title: title, subTitle: subTitle, informativeText: informativeText)
}
}