2013-07-02 4 views
1

У меня есть этот вид, который на нем есть три UIButtons, каждый из которых имеет идентификатор segue, нажав на один VC.Как распознать идентификатор segue на destinationVC из нескольких сегментов?

Вот мой код для получения SEGUE

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"Button 1"]) { 
     [[segue destinationViewController] setBudgetOrderingViewController:self]; 
    } else if ([segue.identifier isEqualToString:@"Button 2"]) { 
     [[segue destinationViewController] setBudgetOrderingViewController:self]; 
    } else if ([segue.identifier isEqualToString:@"Button 3"]) { 
     [[segue destinationViewController] setBudgetOrderingViewController:self]; 
    } 
} 

Есть ли способ узнать, что Segue идентификатор, который загружает destinationVC на destinationVC?

Спасибо.

+1

Объявите объект в контроллере своего назначения и установите его в методе prepareForSegue выше. Затем вы можете определить segue на основе этого свойства. –

ответ

3

Вы можете указать контроллеру вида назначения свойство, которое идентифицирует segue, и установить это свойство в методе prepareForSegue:sender: контроллера представления источника. Пример:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    DestinationViewController *dvc = segue.destinationViewController; 
    dvc.segueIdentifier = segue.identifier; 
    if ([segue.identifier isEqualToString:@"Button 1"]) { 
     [dvc setBudgetOrderingViewController:self]; 
    } else if ([segue.identifier isEqualToString:@"Button 2"]) { 
     [dvc setBudgetOrderingViewController:self]; 
    } else if ([segue.identifier isEqualToString:@"Button 3"]) { 
     [dvc setBudgetOrderingViewController:self]; 
    } 
} 

Однако на самом деле это не очень хороший дизайн. Теперь у вас есть два контроллера представления, которые должны знать все идентификаторы segue. Вы можете забыть обновить один из них, если вы измените идентификатор или добавите новый.

Лучшая конструкция заключается в том, чтобы заставить контроллер представления источника сообщать контроллеру вида назначения, что делать.

Давайте использовать конкретный пример. Предположим, ваше приложение позволяет пользователю отправлять карту другу, когда у друга есть ребенок. Поэтому на главном экране есть три кнопки: «Это мальчик!», «Это девушка!» И «Это щенок!» Когда пользователь нажимает любую из этих кнопок, вы хотите перейти на экран, где пользователь может ввести в сообщении. Вы хотите, чтобы экран ввода сообщений был настроен с темой, на основе которой была нажата кнопка: розовые сердца для девочек, синие грузовики для мальчиков и собачий домик для щенков.

Дайте ваш взгляд назначения контроллера сообщения для каждого из этих возможностей:

@interface MessageComposerViewController : UIViewController 

@property (nonatomic, weak) id<MessageComposerViewControllerDelegate> delegate; 

- (void)useGirlTheme; 
- (void)useBoyTheme; 
- (void)usePuppyTheme; 

@end 

Затем в вашем главном контроллере вида экрана prepareForSegue:sender:, вы проверить идентификатор и отправить соответствующее сообщение на контроллер вида назначения:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    MessageComposerViewController *dvc = segue.destinationViewController; 
    dvc.delegate = self; 
    if ([segue.identifier isEqualToString:@"Girl"]) { 
     [dvc useGirlTheme]; 
    } 
    else if ([segue.identifier isEqualToString:@"Boy"]) { 
     [dvc useBoyTheme]; 
    } 
    else if ([segue.identifier isEqualToString:@"Puppy"]) { 
     [dvc usePuppyTheme]; 
    } 
} 
1
//Declare a string Property in Destination View Controller 
@property (strong, nonatomic) NSString *Segue_Listner; 

//In Source ViewController perform segue method 
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([[segue identifier]isEqualToString:@"destinationVC"]) { 
     DestinationVC *dvc = [segue destinationViewController]; 
     dvc.Segue_Listner = @"somevalue"; 
} 

Проходя весь контроллер представления в порядке, но мы должны быть осторожны, если вид регулятора размера объекта слишком велик. Также убедитесь, что свойство destinationVC объявлено слабым (ТОЛЬКО, ЕСЛИ ВЫ ПРОПУСКАЕТЕ ПРОСМОТРЕТЬ, И ЕЩЕ ЕЩЕ ЕЩЕ В ПАМЯТИ), то есть представляя модально.

Я рекомендую безопасно объявить свойство строки и установить его предыдущим/SourceVC.

Смежные вопросы