Как выполнять по-разному из разных сегментов?

#ios #swift #segue

#iOS #swift #segue

Вопрос:

У меня есть AController с подключенными 2 переходами BController .

В AController я написал это:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "FirstSegue"{
        // do something 
    }
    if segue.identifier == "SecondSegue"{
        // do something 
    }
}
  

Тогда приходите BController , я ищу это:

 if AController.segue.identifer == "FirstSegue"{
    // do something
}

if AController.segue.identifer == "SecondSegue"{
    // do something
}
  

Что мне делать?

Вот раскадровка введите описание изображения здесь

Комментарии:

1. Какие переходы вы пытаетесь создать?

2. Отправьте свой storyborad, тогда я дам вам несколько предложений..

3. что вы хотите, чтобы отправлять данные из AController в BController

4. @KSigWyatt Я пытаюсь представить два перехода как модальные, один для добавления чего-то нового, другой для редактирования существующей информации

5. @AnuradhS Точно. На самом деле мне также нужно изменить внешний вид на основе переходов

Ответ №1:

Возьмите переменную bool в BController

 var isFromA:Bool!
  

В AController:

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "FirstSegue"{
        let vc = segue!.destinationViewController as! BController 
        vc.isFromA = true
    }
    if segue.identifier == "SecondSegue"{
        let vc = segue!.destinationViewController as! BController 
        vc.isFromA = false
    }
 }
  

В BController:

 if isFromA == true{
    // do something
} else {
    // do something
}
  

Комментарии:

1. Разве это as! BController не должно быть связано с тем, что контроллер представления назначения является BController?

Ответ №2:

Аналогично ответу г-на УБ, вы также можете создать переменную, в которой хранится строковое значение перехода:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "FirstSegue"{
        let viewController = segue!.destinationViewController as! BController 
        viewController.sourceSegue = "FirstSegue"
    }
    if segue.identifier == "SecondSegue"{
        let viewController = segue!.destinationViewController as! BController 
        viewController.sourceSegue = "SecondSegue"
    }
}
  

Итак, вы могли бы сделать что-то подобное (в BController), что ближе к тому, что вы изначально хотели:

 var sourceSegue: String!

if sourceSegue == "FirstSegue"{
    // do something
} else if sourceSegue == "SecondSegue"{
    // do something
}
  

Ответ №3:

что вы можете сделать, так это установить общедоступное свойство BOOL в View controller B

 @interface ViewControllerB
@property(nonatomic) BOOL isFirst;
@end
  

при подготовке к переходу ViewControllerA вы можете получить доступ к целевому viewcontroller

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

    if([[segue identifier] isEqualToString:@"FirstSegue"]){
        ViewControllerB * objVC = (ViewControllerB*)[segue destinationViewController];
        objVc.isFirst = TRUE;
    }

if([[segue identifier] isEqualToString:@"SecondSegue"]){
        ViewControllerB * objVC = (ViewControllerB*)[segue destinationViewController];
        objVc.isFirst = FALSE;
    } 
}
  

затем в viewDidLoad ViewControllerB вы можете выполнить другую опцию на основе свойства isFirst,

 if(self.isFirst == TRUE){
//Perform First Segue functions
}else{
//Perform Second Segue Actions
}