Получить отправителя 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) также может быть настроена в объявленном выше методе.