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.
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. –
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