Получить отправителя segue в контроллере вида назначения
У меня есть VC с именем Dashboard (D), который может открыть VC с именем Login (L) и VC с именем Register (R). Вход также может открыть регистр VC.
Я стараюсь использовать раскадровку как можно чаще, поэтому я создал с ней три Segues, D to L, D to R, L to R
Итак, в случае D → L → R и в случае D → R, когда я закрываю R, мне нужно закрыть L, если это необходимо, и сообщить D, что он может начать загружать информацию пользователя ( запуск функции в двух словах).
Итак, я хотел бы получить отправителя Segue в целевом vc, зная, что я поместил его в sender entrie of performSegueWithIdentifier следующим образом:
[self performSegueWithIdentifier:@"SegueToFbRegister" sender:self];
Ответы
Ответ 1
Я бы сделал это, отправив R-уведомление при регистрации/входе и прослушивая D, затем всплывает все и загружает ваши данные.
Если вы настаиваете на получении ссылки на отправителя, вы можете добавить это свойство в свой пункт назначения VC и установить его в источнике VC prepareForSegue:sender:
Ответ 2
Это звучит как отличное место для использования делегатов. В вашем RegisterViewController.h определите протокол, подобный этому
@protocol RegisterViewDelegate <NSObject>
- (void)tellRegisterDelegateSomething:(NSObject*)something;
@end
Затем на вашем классе сохраните указатель на ваш делегат
@interface RegisterViewController : UIViewController
@property (weak, nonatomic) id <RegisterViewDelegate> delegate;
@end
Теперь передайте контроллерам представления представления, что они реализуют новый протокол, который вы только что создали. Это делается в файлах .h других смотрителей, которые представляют это представление.
В LoginViewController.h
@interface LoginViewController : UIViewController <RegisterViewDelegate>
@end
В DashboardViewController.h
@interface DashboardViewController : UIViewController <RegisterViewDelegate>
@end
В .m файлах вышеуказанных классов реализуйте метод протокола
- (void)tellRegisterDelegateSomething:(NSObject*)something
{
}
Теперь вам нужно назначить делегата, когда вы выполняете свой сеанс из представления диспетчера представлений, как это.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"SegueToFbRegister"])
{
RegisterViewController* destination = [segue destinationViewController];
destination.delegate = self;
}
}
Теперь вы можете вызвать контроллер представления представления (делегат) и заставить его что-то делать с любой информацией, необходимой для отправки назад (это будет вызываться в вашем RegisterViewController.m).
if ([self.delegate respondsToSelector:@selector(tellRegisterDelegateSomething:)])
{
// Tell the delegate something.
[self.delegate tellRegisterDelegateSomething:something];
}
Пример, в котором вам нужно пройти через два контроллера, вы следуете одному и тому же базовому шаблону.
@protocol LoginViewDelegate <NSObject>
- (void)tellLoginDelegateSomething:(NSObject*)something;
@end
Затем на вашем классе сохраните указатель на ваш делегат
@interface LoginViewController : UIViewController
@property (weak, nonatomic) id <LoginViewDelegate> delegate;
@end
Теперь сообщите диспетчеру панели управления, что он реализует протокол. Это делается в файлах .h файлов диспетчера представлений Dashboard, которые представляют это представление.
В DashboardViewController.h
@interface DashboardViewController : UIViewController <RegisterViewDelegate, LoginViewDelegate>
@end
В .m файлах DashboardViewController реализует метод протокола
Следуйте приведенному выше шаблону установки делегата в диспетчере представлений при выполнении сеанса. Теперь, когда метод delegate вызывается в LoginViewController, вы также вызываете делегата в DashboardViewController.
в LoginViewController.m
- (void)tellRegisterDelegateSomething:(NSObject*)something
{
if ([self.delegate respondsToSelector:@selector(tellLoginDelegateSomething:)])
{
// Tell the delegate something.
[self.delegate tellLoginDelegateSomething:something];
}
}
Теперь вы все подключены, чтобы передавать данные через оба контроллера (или только один) и что-то делать с ним. Вы узнаете, в каком сценарии вы находитесь, потому что в DashboardViewController будут вызываться разные методы делегатов, на основе которых был видимым диспетчер представлений.
Надеюсь, что это поможет.
Ответ 3
Создайте делегат для R и создайте D и L для реализации методов делегата. Используйте prepareForSegue:sender
для назначения делегата R. Когда вы закончите задачу в R, используйте делегат для выполнения действия rquired.
Ответ 4
Другой способ - использовать разматывание.
Поместите следующий код в панель управления Dashboard (D).
@IBAction func loadUserInfoAfterRegistration(segue: UIStoryboardSegue) {
}
В Interface Builder выполните следующие шаги для контроллера вида Register (R):
- Выберите кнопку, которая будет нажата при завершении регистрации.
- Ctrl + перетащите в символ выхода поверх представления.
- Выберите
loadUserInfoAfterRegistrationWithSegue:
из отображаемого списка.
Используя этот подход, контроллер вида Register (R) всегда будет перемещаться к контроллеру представления Dashboard ( D), независимо от того, что между ними. Контроллеры просмотра между ними не должны быть затронуты. Загрузка пользовательских данных в диспетчере представлений Dashboard ( D) также может быть настроена в объявленном выше методе.