2013-02-19 10 views
11

Mam VC o nazwie Dashboard (D), który może otworzyć VC o nazwie Login (L) i VC o nazwie Register (R). Login może również otworzyć rejestr VC.otrzymasz od nadawcy port w kontrole docelowego widoku

próbuję użyć storyboard tak często, jak to możliwe, więc stworzyłem z nim trzy segues, D do L, R, L do R

Tak więc, w przypadku D -> L -> R aw przypadku D -> R, kiedy zamykam R, muszę zamknąć L, jeśli to konieczne i poinformować D, w którym może rozpocząć ładowanie informacji o użytkowniku (funkcja uruchamiania w skrócie).

Tak, chciałbym dostać nadawcę Segue w docelowym vc, wiedząc, że mogę umieścić go w nadawcy entrie z performSegueWithIdentifier tak:

[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self]; 

Odpowiedz

8

bym to zrobić poprzez R wysłać powiadomienie, gdy rejestracja/logowanie jest zakończone, a po D wysłuchania go, a następnie pop wszystko i załadować swoje dane.

Jeśli jednak domagać się odniesienie do nadawcy, można dodać tę właściwość od miejsca docelowego VC i ustawić go w źródle VC prepareForSegue:sender:

+0

Wielkie dzięki za szybką odpowiedź, nie wiedziałem o powiadomieniu. Próbuję twojej drogi, która wydaje się bardziej właściwa. Ale znasz najlepszy sposób na zamknięcie R i L, wiedząc, że L prawdopodobnie nie jest stworzony. –

+3

Czy używasz 'UINavigationController'?Jeśli tak, 'popToRootViewController:' usunie wszystkie VC, które zostały pchnięte. Jeśli zamiast tego prezentujesz modalne VC, wywołanie metody 'dismissViewControllerAnimated: completion:' na pierwszym przedstawionym kontrolerze spowoduje także odrzucenie wszystkich pozostałych, które zostały przedstawione na wierzchu. – Taum

0

Tworzenie delegata dla R i uczynić D i L wdrożyć delegata methods.Use prepareForSegue:sender przypisać delegata R .Po zakończeniu zadania w R używać delegata wykonać rquired działania.

8

To brzmi jak świetne miejsce do używania Delegatów. W twojej RegisterViewController.h zdefiniować protokół jak ten

@protocol RegisterViewDelegate <NSObject> 
- (void)tellRegisterDelegateSomething:(NSObject*)something; 
@end 

Następnie w klasie utrzymać wskaźnik do delegata

@interface RegisterViewController : UIViewController 
@property (weak, nonatomic) id <RegisterViewDelegate> delegate; 
@end 

teraz powiedzieć kontrolerów widoku przedstawianie że realizują one właśnie utworzony nowy protokół. Odbywa się to w plikach .h innych kontrolerów viewcontroller, które prezentują ten widok.

W LoginViewController.h

@interface LoginViewController : UIViewController <RegisterViewDelegate> 
@end 

W DashboardViewController.h

@interface DashboardViewController : UIViewController <RegisterViewDelegate> 
@end 

W .M plików powyższych klas, wdrożenie metody Protokołu za

- (void)tellRegisterDelegateSomething:(NSObject*)something 
{ 
} 

Teraz trzeba aby przypisać delegata podczas przeprowadzania segue z prezentowania kontrolera widoku w ten sposób .

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"SegueToFbRegister"]) 
    { 
     RegisterViewController* destination = [segue destinationViewController]; 
     destination.delegate = self; 
    } 
} 

Teraz można zadzwonić kontroler widoku przedstawianie (delegata) i ma to coś zrobić z wszelkich informacji trzeba odesłać tak (to będzie się nazywać w RegisterViewController.m).

if ([self.delegate respondsToSelector:@selector(tellRegisterDelegateSomething:)]) 
{ 
    // Tell the delegate something. 
    [self.delegate tellRegisterDelegateSomething:something]; 
} 

Instancja, w której trzeba przejść z powrotem przez dwa kontrolery, postępuje się według tego samego podstawowego wzorca.

@protocol LoginViewDelegate <NSObject> 
- (void)tellLoginDelegateSomething:(NSObject*)something; 
@end 

Następnie w klasie utrzymać wskaźnik do delegata

@interface LoginViewController : UIViewController 
@property (weak, nonatomic) id <LoginViewDelegate> delegate; 
@end 

teraz powiedzieć kontroler widok Dashboard, że implementuje protokół. Odbywa się to w plikach .h kontrolerów kontrolek pulpitu nawigacyjnego, które prezentują ten widok.

W DashboardViewController.h

@interface DashboardViewController : UIViewController <RegisterViewDelegate, LoginViewDelegate> 
@end 

W .M aktach DashboardViewController wdrożyć metoda Protokołu za

Śledź powyższy wzór ustawiania delegata na viewcontroller podczas wykonywania segue. Teraz, gdy wywoływana metoda jest wywoływana w LoginViewController, wywołujesz delegata również w kontrolerze DashboardViewController.

w LoginViewController.m

- (void)tellRegisterDelegateSomething:(NSObject*)something 
{ 
    if ([self.delegate respondsToSelector:@selector(tellLoginDelegateSomething:)]) 
    { 
     // Tell the delegate something. 
     [self.delegate tellLoginDelegateSomething:something]; 
    } 
} 

Teraz są połączone, dzięki czemu można przekazać dane z powrotem przez obu kontrolerów (lub tylko jeden) i coś z tym zrobić. Będziesz wiedział, w którym scenariuszu się znajdujesz, ponieważ różne metody delegatów będą wywoływane w DashboardViewController na podstawie tego, który viewcontroller był widoczny.

Mam nadzieję, że to pomoże.

+0

Dziękuję również, ale rozwiązanie Taum jest prostsze dla początkujących użytkowników ios. –

+0

To nie problem. Jego jest również całkowicie ważny. Korzystanie z podejścia delegowanego jest tylko trochę bardziej elastyczne, ponieważ możesz oddzwonić do swojego przedstawiciela z informacjami z bieżącego widoku. Jest także bardziej przydatny w scenariuszach, w których masz widoki modalne lub pop-over, ponieważ możesz wysłać informacje z powrotem do delegata i nie zawsze masz możliwość po prostu popping tych typów widoków z kontrolera nawigacji. Zdecydowanie potężne narzędzie do nauki (i niezbyt skomplikowane) nawet dla początkujących. Powodzenia – johnrechd

0

Innym sposobem byłoby użycie odprężenia relaksacyjnego.

Umieść następujący kod: Deska rozdzielcza (D) kontroler widoku.

@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) { 

} 

interfejs Builder, wykonaj następujące kroki dla Rejestru (R) Zobacz Kontroler:

  1. wybierz przycisk, który zostanie wciśnięty na zakończeniu rejestracji.
  2. Ctrl + przeciągnij do symbolu wyjścia na górze widoku.
  3. Wybierz loadUserInfoAfterRegistrationWithSegue: z wyświetlonej listy.

Stosując to podejście, Rejestracja (R) Widok kontroler będzie zawsze przejdź do Dashboard (D) widok kontroler, niezależnie od tego, co jest między nimi. Kontrolery widoku między nimi nie będą musiały być dotykane. Ładowanie danych użytkownika w kontrolerze widoku kontrolera () może być dostosowane w sposób zadeklarowany powyżej.