Mam wiele adnotacji w widoku mapy (z rightCalloutAccessory
przyciskami). Przycisk wykona przejście od tego mapview
do a tableview
. Chcę przekazać tableview
inny obiekt (który przechowuje dane) w zależności od tego, który przycisk objaśnienia został kliknięty.
Na przykład: (całkowicie wykonane)
- adnotacja1 (Austin) -> przekaż dane obj 1 (dotyczy Austin)
- adnotacja2 (Dallas) -> przekaż dane obj 2 (dotyczy Dallas)
- adnotation3 (Houston) -> przekaż dane obj 3 i tak dalej ... (masz pomysł)
Jestem w stanie wykryć, który przycisk objaśnienia został kliknięty.
Używam prepareForSegue
: do przekazania danych obj do miejsca docelowego ViewController
. Ponieważ nie mogę zmusić tego wywołania do przyjęcia dodatkowego argumentu dla danych, których potrzebuję, jakie są eleganckie sposoby osiągnięcia tego samego efektu (dane dynamiczne obj)?
Wszelkie wskazówki będą mile widziane.
ios
xcode
uitableview
mapkit
storyboard
chichot
źródło
źródło
Odpowiedzi:
Po prostu chwyć referencję do kontrolera widoku docelowego
prepareForSegue:
metodą i przekaż tam potrzebne obiekty. Oto przykład ...REWIZJA: Możesz także użyć
performSegueWithIdentifier:sender:
metody, aby aktywować przejście do nowego widoku na podstawie wyboru lub naciśnięcia przycisku.Rozważmy na przykład, że mam dwa kontrolery widoku. Pierwszy zawiera trzy przyciski, a drugi musi wiedzieć, który z tych przycisków został naciśnięty przed przejściem. Możesz połączyć przyciski
IBAction
z kodem, który używaperformSegueWithIdentifier:
metody, takiej jak ta ...EDYCJA: Aplikacja demo, którą pierwotnie załączyłem, ma teraz sześć lat, więc usunąłem ją, aby uniknąć nieporozumień.
źródło
[vc setMyObjectHere:object];
dynamicznie. tj. obj1 dla button1, obj2 dla button2 Problem polega na tym, że nie mogę przekazać argumentu. Czy jest na to jakiś sposób?Czasami pomocne jest uniknięcie tworzenia zależności czasu kompilacji między dwoma kontrolerami widoku. Oto jak możesz to zrobić bez dbania o typ kontrolera widoku docelowego:
Tak długo, jak docelowy kontroler widoku deklaruje własność publiczną, np .:
możesz ustawić tę właściwość w poprzednim kontrolerze widoku, jak opisano powyżej.
źródło
setMyData:
. To jest zależność. Fakt, że używasz selektora, aby uniknąć błędu kompilacji, powinien być traktowany jako słabość twojego podejścia, a nie korzyść. Szokuje mnie, jak wielu programistów straciło koncepcję, że błędy czasu kompilacji powinny być preferowane zamiast błędów czasu wykonywania.W Swift 4.2 zrobiłbym coś takiego:
źródło
Mam klasę nadawcy , jak to
Używam tej klasy nadawcy do przekazywania obiektów
prepareForSeque:sender:
źródło
prepareForSegue
albo jesteśmy wdrożenia go i założenie jest prepareForSegue dostaje się nazywa czyli my nie trzeba zrobić coś podobnego[self prepareForSegue]
Natknąłem się na to pytanie, gdy próbowałem nauczyć się przesyłać dane z jednego kontrolera widoku do drugiego. Potrzebuję jednak czegoś wizualnego, aby pomóc mi się uczyć, więc ta odpowiedź stanowi uzupełnienie innych, które już tu są. Jest to nieco bardziej ogólne niż pierwotne pytanie, ale można je dostosować do pracy.
Ten podstawowy przykład działa w następujący sposób:
Pomysł polega na przekazaniu ciągu znaków z pola tekstowego w Pierwszym kontrolerze widoku do etykiety w drugim kontrolerze widoku.
Kontroler pierwszego widoku
Kontroler drugiego widoku
Pamiętaj by
UITextField
iUILabel
.Źródło
Jak wysyłać dane przez segue (szybki) (samouczek YouTube)
Zobacz też
Zobacz kontrolery: Przekazywanie danych do przodu i do tyłu (pełna odpowiedź)
źródło
Dla Swift użyj tego,
źródło
Zaimplementowałem bibliotekę z kategorią na UIViewController, która upraszcza tę operację. Zasadniczo ustawiasz parametry, które chcesz przekazać, w NSDictionary powiązanym z elementem interfejsu użytkownika, który wykonuje segment. Działa również z ręcznymi sekwencjami.
Na przykład możesz to zrobić
do ręcznego segue lub utwórz przycisk z segue i użyj
Jeśli kontroler widoku docelowego nie jest zgodny z kluczem klucz-wartość, nic się nie dzieje. Działa również z kluczowymi wartościami (przydatny przy odwijaniu sekwencji). Sprawdź tutaj https://github.com/stefanomondino/SMQuickSegue
źródło
Moje rozwiązanie jest podobne.
źródło
Po prostu użyj tej funkcji.
źródło
Użyłem tego rozwiązania, aby móc zachować wywołanie segue i transmisję danych w ramach tej samej funkcji:
Przypadek użycia może wyglądać następująco:
Wydaje mi się, że to działa, jednak nie jestem w 100% pewien, że funkcje wykonywania i przygotowywania są zawsze wykonywane w tym samym wątku.
źródło