iOS 7 — определите переход, который вызывал представление для правильной раскрутки

У меня есть UIViewController, который может быть представлен двумя другими представлениями. Это форма поиска, которая действует одинаково для обоих представлений.

Допустим, View1 и View2 могут выполнять переходы, представляющие экземпляр SearchView. Как я могу узнать, какое представление представляет SearchView, чтобы выполнить откат, связанный с соответствующим действием?

Поскольку и View1, и View2 являются TabViews, я не хочу использовать navigationController в каждом из них, так как считаю, что это немного перегружено для простой задачи.

В этом примере:

Вид1.м

-(IBAction)didClickButton:
{
    [self performSegueWithIdentifier:@"searchSegue1"];
}

Вид2.м

-(IBAction)didClickButton:
{
    [self performSegueWithIdentifier:@"searchSegue2"];
}

SearchView.m

// Here is where I should know which segue to call
if (***ConditionToSegue1***)
    [self performSegueWithIdentifier:@"unwindToSegue1"];

else if (***ConditionToSegue2***)
    [self performSegueWithIdentifier:@"unwindToSegue2"];

Что это за условие? Является ли лучший способ сделать это, просто установить свойство SearchView в методах prepareForSegue, которое сообщает мне, какое представление инициировало вызов? Пожалуйста, имейте в виду, что я не хочу использовать NavigationController.

С наилучшими пожеланиями


person Theo    schedule 22.02.2014    source источник


Ответы (4)


В SearchView.h добавьте строку @property (nonatomic) int tag.

Затем в View1.m добавьте следующий метод:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"searchSegue1"])
        [segue.destinationViewController setValue:1 forKey:@"tag"];
}

Сделайте то же самое в View2.m, но замените 1 на 2. Затем измените оператор if на:

if (self.tag == 1)
    [self performSegueWithIdentifier:@"unwindToSegue1"];
else if (self.tag == 2)
    [self performSegueWithIdentifier:@"unwindToSegue2"];
person Pranav    schedule 22.02.2014
comment
Это хороший подход. Я думал об использовании чего-то подобного, но нашел лучший, который, кажется, работает. - person Theo; 23.02.2014
comment
Нет, мое что-то получше не сработало полностью. Пометка вашего ответа как правильного. - person Theo; 23.02.2014

Прежде всего, вы должны знать, используете ли вы раскадровку или программно создаете раскадровку для ВЫПОЛНЕНИЯ SEGUE.

    1.If you directly connect the segue through the click button(one view controller to another view controller),you don't need to write your above coding.Just it is enough to give segue name. 
            click->SHOW THE ATTRIBUTES OF RIGHT SIDE UTILITY AREA.
                 ->NOW YOU CAN SEE THE STORYBOARD SEGUE WITH-IDENTIFIER,STYLE 
                 ->IN IDENTIFIER TEXTFIELD JUST GIVE YOUR SEGUE NAME(WHATEVER YOU WANT)
                   (IN STYLE-PUSH IS DEFAULT IF YOU CONNECT THE SEGUE AS A PUSH)
person user3182143    schedule 22.02.2014

В вашей ситуации это может быть так же просто, как [self dismissViewControllerAnimated: YES completion: nil];

Прочтите этот пост в блоге под названием Расслабление переходов.

http://chrisrisner.com/Unwinding-with-iOS-and-Storyboards

Вы можете связать действие с компонентом Exit на раскадровке, который сделает раскрутку за вас.

-(IBAction)reset:(UIStoryboardSegue *)segue {
    //do stuff
}
person Joe McBride    schedule 22.02.2014

Я узнал, что есть простой ответ на этот вопрос. По-видимому, если я создам действие раскрутки на обоих контроллерах представления с одинаковыми именами, я также смогу создать только один переход раскрутки для них обоих.

Если я выполняю этот переход в SearchView, он вызывает правильное действие в зависимости от того, кто его представил.

Кажется, это работает на данный момент, я действительно не знаю, почему и как это происходит. Был бы признателен, если бы кто-нибудь объяснил.

ОБНОВЛЕНИЕ: Нет, это не работает должным образом. Хотя представлено правильное представление, вызываются оба действия, что приводит к нежелательному поведению.

person Theo    schedule 23.02.2014