Сохранить экземпляр класса, пока программа не завершится без использования NSObject? - PullRequest
0 голосов
/ 16 сентября 2018

Я пишу библиотеку 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)
    }
}
...