#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
}