프로그래밍 방식으로 Segue를 수행하고 매개 변수를 대상보기로 전달


174

내 응용 프로그램에는 프로그래밍 방식으로 segue를 수행하는 버튼이 있습니다.

- (void)myButtonMethod
{
    //execute segue programmatically
    [self performSegueWithIdentifier: @"MySegue" sender: self];
}

대상보기를 참조하고 일부 매개 변수를 전달하는 방법이 있는지 알고 싶습니다.

나는 prepareForSegue방법에서 그것을 참조 할 수 있다는 것을 알고 myDestinationViewController *vc = [segue destinationViewController];있지만, 프로그래밍 방식으로 segue를 실행하는 방법을 모르겠습니다.

당신은 어떤 아이디어가 있습니까?

감사합니다, yassa


최신 정보:

이 질문에 대해 죄송합니다 !!! segue가 프로그래밍 방식으로 호출 되더라도 prepareForSegue메소드가 어쨌든 호출되므로 동일한 일반적인 방식으로 매개 변수를 전달할 수 있음을 발견했습니다.


44
답변으로 업데이트를 추가하고 수락하면 사람들이이 답변을
받았습니다.

답변을 추가하고 알림을 남길 수 있습니다.
DanSkeel

11
아래 답변 을 올바른 것으로 표시하여 사람들이 답변을 받았습니다.
lindon fox

답변:


107

답은 단순히 segue가 어떻게 트리거되는지 차이가 ​​없다는 것입니다.

prepareForSegue:sender:메소드는 어떤 경우에도 호출되며 여기에서 매개 변수를 전달합니다.


3
이것은 여전히 ​​나를 귀찮게합니다-이것은 한 곳에서 segue를 트리거해야한다는 것을 의미합니다. 여기서 나는 다른 곳에서 멋지게 격리 된 매개 변수로 보내려는 데이터가 있지만 완전히 다른 장소에 데이터를 추가해야합니다 -preposeForSegue 전달해야하는 데이터에 대해 아무것도 모릅니다. 의미, 나는 두 가지 다른 기능 (하나는 트리거 segue, 다른 하나는 준비)이 공유하는 컨텍스트에서 해당 데이터로 상태를 만들어야합니다. 데이터가있는 새로운 뷰를 여는 것만으로도 상태를 더럽 히고 싶지 않습니다.
NeverwinterMoon

발신자를 사용하여 대상 VC를 구성하는 데 필요한 컨텍스트를 전달하십시오.
trapper

발신자에게 페이로드를 전달하는 것이 반 패턴이라고 가정했습니다. 여기에는 segue를 트리거 한 것이 더 이상 전달하려는 데이터가 아니라 segue를 트리거 한 사람에 대한 정보 만 포함되어야합니다.
NeverwinterMoon

발신자의 공식 문서에서 : "이 개체는 실제 segue 동안 정보 용으로 제공됩니다."
NeverwinterMoon

1
예, 실제 페이로드를 전달하지 말고 어떤 셀 / 버튼 / 인덱스 등이 segue를 트리거했는지와 같은 컨텍스트를 전달하십시오.
trapper

90

오래된 질문이지만 여기에 원하는 것을 수행하는 방법에 대한 코드가 있습니다. 이 경우 테이블 뷰의 선택된 셀에서 다른 뷰 컨트롤러로 데이터를 전달합니다.

trget 뷰의 .h 파일에서 :

@property(weak, nonatomic)  NSObject* dataModel;

.m 파일에서 :

@synthesize dataModel;

dataModel할 수있다 string, int또는이 경우처럼 많은 항목이 포함 된 모델입니다

- (void)someMethod {
     [self performSegueWithIdentifier:@"loginMainSegue" sender:self];
 }

또는...

- (void)someMethod {
    UIViewController *myController = [self.storyboard instantiateViewControllerWithIdentifier:@"HomeController"];
    [self.navigationController pushViewController: myController animated:YES];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"storyDetailsSegway"]) {
        UITableViewCell *cell = (UITableViewCell *) sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSDictionary *storiesDict =[topStories objectAtIndex:[indexPath row]];
        StoryModel *storyModel = [[StoryModel alloc] init];
        storyModel = storiesDict;
        StoryDetails *controller = (StoryDetails *)segue.destinationViewController;
        controller.dataModel= storyModel;
    }
}

3

스위프트 4 :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ExampleSegueIdentifier" {
        if let destinationVC = segue.destination as? ExampleSegueVC {
            destinationVC.exampleString = "Example"
        }
    }
}

스위프트 3 :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "ExampleSegueIdentifier" {
            if let destinationVC = segue.destinationViewController as? ExampleSegueVC {
                destinationVC.exampleString = "Example"
            }
        }
    }

0

한곳에서 segue를 수행하고 segue 준비를 위해 매개 변수를 보내도록 상태를 유지하는 문제를 이해합니다.

나는 이것을하는 방법을 알아 냈습니다. 범주를 사용하여 userInfoDict라는 속성을 ViewControllers에 추가했습니다. 그리고 나는 보낸 사람이 스스로 (컨트롤러 자체를 의미하는) 방식으로 식별자로 segue를 수행하는 것을 무시했습니다. 이 userInfoDict를 다음 ViewController에 전달합니다.

여기서 전체 UserInfoDict를 전달하는 대신 특정 매개 변수를 발신자로 전달하고 그에 따라 재정의 할 수도 있습니다.

명심해야 할 1 가지. ur performSegue 메소드에서 수퍼 메소드를 호출하는 것을 잊지 마십시오.


0

새로운 빠른 버전을 사용하는 경우.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "ChannelMoreSegue" {

        }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.