Exemples de délégués à Swift
j'ai essayé d'apprendre comment fonctionne la délégation avec des protocoles. J'ai tout compris, mais je ne sais pas quand utiliser la délégation autrement qu'en utilisant des vues de table et peut-être des vues de défilement.
en général, quand la délégation est-elle utilisée?
4 réponses
Qu'est-ce que la délégation?
tout d'abord, vous devez savoir que modèle de délégation n'est pas exclusif pour iOS world:
en génie logiciel, le modèle de délégation est un modèle de conception en programmation orientée objet qui permet à la composition objet d'atteindre le même code réutilise comme héritage.
mais travailler avec délégation dans l'iOS monde est si commun, je suppose que vous pouvez voir beaucoup de classes qui fournissent une délégation/source de données pour donner la capacité de fournir des propriétés ou des comportements pour l'instance utilisée. Il s'agit d'un des principaux mécanismes de communication des objets à CocoaTouch.
solutions de rechange":
Toutefois, la délégation est pas la seule façon de laisser les objets de parler les uns aux autres dans iOS, vous pouvez sachez qu'il y a:
- NotificationCenter .
- KVO (Clé-Valeur de l'Observation) .
- Achèvement des gestionnaires/Rappels (à l'aide de fermetures) .
- Cible-Action .
Remarque : dans le cas où vous êtes si vous souhaitez comparer entre eux, vous pouvez consulter les articles suivants:
- Les Modes De Communication.
- Quand à l'Utilisation de la Délégation, de la Notification ou de l'Observation dans iOS.
- délégués vs observateurs.
quand utiliser la délégation?
Donc, la question est: "alors pourquoi devrais-je utiliser la délégation au lieu de ces options?"
je vais essayer de faire simple; je suggérerais l'utilisation de la délégation quand vous avez un à un relation entre deux objets. Juste pour le rendre plus clair, le objectif de parler un peu sur le NotificationCenter est d'essayer de faire sens lorsque les délégations sont utilisées:
Centre de notification représente un à plusieurs "relation; simplement, cela fonctionne comme: affichage (notification) une notification sur un événement spécifique et observer (obtenir notifié à propos de) cette notification-il pourrait être observé anywhere autrement; logiquement, c'est ce que signifie une relation à plusieurs. C'est une représentation de la Modèle Observateur .
Comment faire une demande délégation?
aux fins de simplification, je le mentionnerais par étapes:
-
sachant les exigences: chaque délégué a sa propre règles , énumérés dans le protocole délégué qui est un ensemble de signatures de méthode que vous devriez mettre en œuvre pour se conformer à cette délégation.
-
conforme pour la délégation: il est tout simplement laisser votre classe pour être un délégué, en le marquant. Par exemple:
class ViewController: UIViewController, UITableViewDelegate {}
. -
connecter l'objet délégué: marquer votre classe pour être un délégué est pas assez, vous devez vous assurer que l'objet que vous voulez être confirmé par votre classe pour donner l'emploi de votre classe.
-
mise en œuvre des exigences: enfin, votre classe doit mettre en œuvre toutes les méthodes requises énumérées dans le protocole délégué.
Par Exemple
est-ce un peu confus? Que penser d'un exemple réel?
envisager le scénario suivant:
Imaginez que vous construisez une application liée à la lecture d'audios. Certains viewControllers devraient avoir une vue d'un lecteur audio . Dans le cas le plus simple, nous supposons qu'il devrait avoir un bouton play/pause et un autre bouton pour, disons, montrer une liste de lecture d'une façon ou d'une autre, peu importe à quoi elle ressemble.
jusqu'ici si bon, la vue du lecteur audio a sa classe séparée UIView
et son fichier .xib
; il doit être ajouté comme sous-vue dans n'importe quel viewController désiré.
maintenant, comment pouvez-vous ajouter des fonctionnalités aux deux boutons de chaque viewController? Vous pourriez penser: "tout simplement, je vais ajouter un IBAction
dans la classe de vue et c'est tout", à première vue, il pourrait sembler ok, mais après avoir repensé un peu, vous vous rendrez compte qu'il ne sera pas applicable si vous essayez de gérer l'événement de tapoter le bouton à la couche controller; pour être clair, que se passe-t-il si chaque viewController implémente des fonctionnalités différentes en appuyant sur les boutons de la vue audio du lecteur? Par exemple: en tapant la liste de lecture dans "a" viewController affichera une vue de table, mais en la tapant dans le viewController "B" affichera un picker.
Eh bien, appliquons délégation à cette question:
le " # " comments represents the étapes de " comment faire une demande de délégation?" section.
Lecteur Audio De Vue:
// # 1: here is the protocol for creating the delegation
protocol AudioPlayerDelegate: class {
func playPauseDidTap()
func playlistDidTap()
}
class AudioPlayerView: UIView {
//MARK:- IBOutlets
@IBOutlet weak private var btnPlayPause: UIButton!
@IBOutlet weak private var btnPlaylist: UIButton!
// MARK:- Delegate
weak var delegate: AudioPlayerDelegate?
// IBActions
@IBAction private func playPauseTapped(_ sender: AnyObject) {
delegate?.playPauseDidTap()
}
@IBAction private func playlistTapped(_ sender: AnyObject) {
delegate?.playlistDidTap()
}
}
Contrôleur De Vue:
class ViewController: UIViewController {
var audioPlayer: AudioPlayerView?
// MARK:- Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
audioPlayer = AudioPlayerView()
// # 3: the "AudioPlayerView" instance delegate will implemented by my class "ViewController"
audioPlayer?.delegate = self
}
}
// # 2: "ViewController" will implement "AudioPlayerDelegate":
extension ViewController: AudioPlayerDelegate {
// # 4: "ViewController" implements "AudioPlayerDelegate" requirments:
func playPauseDidTap() {
print("play/pause tapped!!")
}
func playlistDidTap() {
// note that is should do a different behavior in each viewController...
print("list tapped!!")
}
}
Astuce:
Comme l'un des plus populaire exemples d'utilisation de la délégation est transmission de Données entre les contrôleurs de vue.
la délégation est utilisée lorsque vous voulez transmettre une information ou un État de l'objet A à un autre objet B. habituellement, l'objet B est l'objet qui a créé l'objet A.
je vais énumérer quelques situations où vous utiliseriez la délégation.
-
Oui, vous avez raison. les vues de table et les vues de défilement utilisent les délégués parce qu'ils veulent dire à quiconque est intéressé (usuall your view controller) que "quelqu'un a choisi une rangée!"ou "quelqu'un défilement le défilement de la vue!". Non seulement les vues de défilement et les vues de table utilisent des délégués,
UITextField
etUIDatePicker
et beaucoup d'autres vues utilisent des délégués aussi! -
voir les contrôleurs ont aussi des délégués. Par exemple,
UIImagePickerController
. La raison pour laquelle est à peu près la même que ci - dessus-parce que leUIImagePickerController
veut vous dire des messages comme "une image a été sélectionnée!". Un autre exemple seraitUIPopoverControllerDelegate
. Ce délégué vous dit des choses comme " le liste a été rejetée!" -
les autres classes qui utilisent des délégués comprennent
CLLocationManager
. Ce délégué vous dit des choses comme "l'emplacement de l'utilisateur a été détecté" ou "impossible de détecter l'emplacement de l'utilisateur". -
vous pouvez utiliser delegation dans votre code lorsqu'un de vos Controllers de vue veut envoyer des messages à d'autres controllers de vue. Si c'est un contrôleur de vue de paramètres, il pourrait envoyer des messages comme "la taille des caractères a été modifiée!"et le contrôleur de vue qui se soucie du réglage de la taille de la police va connaître et changer la taille de la police d'une étiquette ou quelque chose.
méthode de Délégation aux Sélectionsimages
créer la classe de base et insérer le code suivant
créer une autre classe puis insérer le code
délégation dans le monde IOS et surtout dans MVC (Model View Controller)
est un moyen pour la vue de parler au contrôleur et il est appelé " communication aveugle"
et la délégation signifie donner le "bâton de direction" à un autre objet (ne se soucie pas vraiment de savoir qui prend le contrôle, mais habituellement le contrôleur) pour contrôler les composants que la vue ne peut pas contrôler elle-même (rappelez-vous que ce n'est qu'une vue) ou ne possède pas
pour le rendre plus simple ....
le contrôleur peut parler d'un point de vue, mais la vue ne peux pas parler pour le contrôleur sans Délégation