Jak zabrać się za delegowanie, tj. NSUserNotificationCenterDelegate
Szybko?
delegates
swift
delegation
user3718173
źródło
źródło
Odpowiedzi:
Nie różni się zbytnio od obj-c. Najpierw musisz określić protokół w swojej deklaracji klasy, na przykład:
Implementacja będzie wyglądać następująco:
Oczywiście musisz ustawić delegata. Na przykład:
źródło
@interface MyCustomClass: UIViewController <ClassIWantToUseDelegate>
, co pozwala na zainicjowanie / skonfigurowanie kontrolera widoku, a także wywołanie metod delegata na podglądzie? Coś podobnego do tego ?Oto mała pomoc dotycząca delegatów między dwoma kontrolerami widoku:
Krok 1: Stwórz protokół w UIViewController, który usuniesz / będziesz wysyłać dane.
Krok 2: Zadeklaruj delegata w klasie wysyłającej (tj. UIViewcontroller)
Krok 3: Użyj delegata w metodzie klasowej, aby wysłać dane do metody odbierającej, czyli dowolnej metody, która przyjmuje protokół.
Krok 4: Przyjęcie protokołu w klasie odbierającej
Krok 5: Zaimplementuj metodę delegata
Krok 6: Ustaw delegata w pliku PrzygotowanieForSegue:
I to powinno działać. To oczywiście tylko fragmenty kodu, ale powinno dać ci pomysł. Aby uzyskać długie wyjaśnienie tego kodu, możesz przejść do mojego wpisu na blogu tutaj:
segues i delegaci
Jeśli jesteście ciekawi co się dzieje pod maską z delegatem to napisałem o tym tutaj:
pod maską z delegatami
źródło
weak
jest potrzebny tylko w przypadku klas, a nie struktur i wyliczeń. Jeśli delegat ma być strukturą lub wyliczeniem, nie musisz się martwić o zachowanie cykli. Jednak delegat jest klasą a (jest to prawdą w wielu przypadkach, ponieważ dość często jest to ViewController), wtedy potrzebujesz,weak
ale musisz zadeklarować swój protokół jako klasę. Więcej informacji można znaleźć tutaj stackoverflow.com/a/34566876/296446Delegaci zawsze wprawiali mnie w zakłopotanie, dopóki nie zdałem sobie sprawy, że delegat to tylko klasa, która wykonuje jakąś pracę dla innej klasy . To tak, jakby ktoś inny wykonywał za Ciebie całą brudną robotę, której nie chcesz wykonywać samodzielnie.
Napisałem krótką historię, aby to zilustrować. Przeczytaj to na placu zabaw, jeśli chcesz.
Pewnego razu...
W przeglądzie istnieją trzy kluczowe części tworzenia i używania wzorca delegata.
Prawdziwe życie
W porównaniu z powyższą historią Bossy Big Brother, delegaci są często wykorzystywani do następujących praktycznych zastosowań:
Wspaniałą częścią jest to, że te klasy nie muszą wcześniej nic o sobie wiedzieć, z wyjątkiem tego, że klasa delegatów jest zgodna z wymaganym protokołem.
Gorąco polecam przeczytanie poniższych dwóch artykułów. Pomogli mi zrozumieć delegatów nawet lepiej niż dokumentacja .
Jeszcze jedna uwaga
Delegaci odwołujący się do innych klas, których nie są właścicielami, powinni używać
weak
słowa kluczowego, aby uniknąć silnych cykli odwołań. Zobacz tę odpowiedź, aby uzyskać więcej informacji.źródło
Mam kilka poprawek do posta @MakeAppPie
Po pierwsze, podczas tworzenia protokołu delegata powinien on być zgodny z protokołem klasy. Jak w przykładzie poniżej.
Po drugie, twój delegat powinien być słaby, aby uniknąć zatrzymania cyklu.
Wreszcie, jesteś bezpieczny, ponieważ Twój protokół jest wartością opcjonalną. Oznacza to, że jego wiadomość „nil” nie zostanie wysłana do tej właściwości. Jest podobny do instrukcji warunkowej z
respondToselector
w objC, ale tutaj masz wszystko w jednym wierszu:Powyżej znajduje się przykład obj-C, a poniżej przykład języka Swift, jak to wygląda.
źródło
delegate?.myMethod
, nie ulegnie awarii, ponieważ jeśli delegat jest,nil
to nic się nie stanie. Jednak jeśli się pomylisz i napisałdelegate!.myMethod
pan mógł upaść, jeżeli pełnomocnik nie jest ustawiona, więc jej w zasadzie sposobem, aby być bezpieczne ...Oto streszczenie, które zebrałem. Zastanawiałem się nad tym samym, co pomogło mi w lepszym zrozumieniu. Otwórz to w Xcode Playground, aby zobaczyć, co się dzieje.
źródło
UIViewController
klasa była zgodna z delegatem, którego stworzyliśmy? Czy muszą być zadeklarowane w jednym szybkim pliku? Każda pomoc będzie wiele znaczyć.class ViewController : UIViewController NameOfDelegate
.a.swift
zgodnie z twoją odpowiedzią powyżej, nie pojawia sięb.swift
. Nie mogę dotrzeć do żadnej klasy poza moim szybkim plikiem. jakieś trudności?DELEGACI W SWIFT 2
Wyjaśniam na przykładzie Delegata z dwoma ViewControllers.W tym przypadku obiekt SecondVC wysyła dane z powrotem do pierwszego kontrolera widoku.
Klasa z deklaracją protokołu
W First ViewController zgodność z protokołem odbywa się tutaj:
Definicja metody protokołu w kontrolerze First View (ViewController)
Podczas wypychania SecondVC z kontrolera pierwszego widoku (ViewController)
źródło
Pierwsza klasa:
Druga klasa:
źródło
Type 'ViewController' does not conform to protocol 'NetworkServiceDelegate'
sugeruje plz. To mój szósty dzień na szybkim :)Bardzo łatwe krok po kroku (w 100% sprawne i przetestowane)
krok 1: Utwórz metodę na pierwszym kontrolerze widoku
Krok 2: ustaw delegata podczas wypychania do drugiego kontrolera widoku
step3: ustaw delegata jak
class ViewController: UIViewController, ProcessStatusDelegate {
krok 4: Utwórz protokół
krok 5: weź zmienną
Krok 6: Podczas gdy wróć do poprzedniego widoku metody delegata wywołania kontrolera, najpierw wyświetl powiadomienie kontrolera z danymi
źródło
Prosty przykład:
źródło
Delegaci to wzorzec projektowy, który umożliwia jednemu obiektowi wysyłanie komunikatów do innego obiektu, gdy ma miejsce określone zdarzenie. Wyobraź sobie, że obiekt A wywołuje obiekt B, aby wykonać akcję. Po zakończeniu działania obiekt A powinien wiedzieć, że B wykonał zadanie i podjąć niezbędne działania, można to osiągnąć z pomocą delegatów! Oto samouczek implementujący delegatów krok po kroku w Swift 3
Link do samouczka
źródło
Powyższe rozwiązania wydawały się nieco powiązane, a jednocześnie unikały ponownego użycia tego samego protokołu w innych kontrolerach, dlatego przyszedłem z rozwiązaniem, które jest silniej wpisywane przy użyciu ogólnego wymazywania typów.
wyjście : otrzymano nową wartość newValue
źródło
W szybkim 4.0
Utwórz delegata w klasie, która musi wysyłać dane lub udostępniać funkcje innym klasom
Lubić
Potem w klasie, która potwierdzi delegatowi
źródło