131 votes

Comment créer des notifications personnalisées dans Swift 3?

En Objective-C, une notification personnalisée n’est qu’une simple NSString, mais la version WWDC de Swift 3 n’est pas évidente.

423voto

Cesar Varela Points 3626

Il y a un moyen plus propre (je pense) d'y parvenir

 extension Notification.Name {

    static let onSelectedSkin = Notification.Name("on-selected-skin")
}
 

Et puis vous pouvez l'utiliser comme ça

 NotificationCenter.default.post(name: .onSelectedSkin, object: selectedSkin)
 

38voto

halil_g Points 400

Vous pouvez également utiliser un protocole pour cela

Puis définissez vos noms de notification comme un `` partout où vous voulez. Par exemple :

Et l’utiliser comme

De cette façon les noms notification vont être dissociés de la Fondation . Et seulement, vous devrez modifier votre protocole en cas de la mise en œuvre de changements.

37voto

hexdreamer Points 806

La Notification.poste est défini comme:

public func post(name aName: NSNotification.Name, object anObject: AnyObject?)

En Objective-C, le nom de notification est une plaine NSString. En Swift, il est défini comme NSNotification.Nom.

NSNotification.Le nom est défini comme:

public struct Name : RawRepresentable, Equatable, Hashable, Comparable {
    public init(_ rawValue: String)
    public init(rawValue: String)
}

C'est un peu bizarre, car je m'attends à ce qu'il soit un Enum, et de ne pas coutume, struct avec apparemment pas de plus d'avantages.

Il y a un typealias dans la Notification pour NSNotification.Nom:

public typealias Name = NSNotification.Name

La confusion, c'est que, de Notification et de NSNotification existent dans de Swift

Afin de définir votre propre déclaration, ne somethine comme:

public class MyClass {
    static let myNotification = Notification.Name("myNotification")
}

Puis l'appeler:

NotificationCenter.default().post(name: MyClass.myNotification, object: self)

13voto

Zoltan Varadi Points 839

Manière plus facile:

 let name:NSNotification.Name = NSNotification.Name("notificationName")
NotificationCenter.default.post(name: name, object: nil)
 

11voto

efremidze Points 1378

Vous pouvez ajouter un initialiseur personnalisé à NSNotification.Name

 extension NSNotification.Name {
    enum Notifications: String {
        case foo, bar
    }
    init(_ value: Notifications) {
        self = NSNotification.Name(value.rawValue)
    }
}
 

Usage:

 NotificationCenter.default.post(name: Notification.Name(.foo), object: nil)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X