2013-04-07 3 views
6

나는 다음의 코드가 항상 새로운 TagsFeedViewController를 생성한다는 것을 깨달았다. 이것은 segues의 기본 동작입니까? 매번 새로운 destinationViewController를 만들지 않도록 iOS를 구성하는 방법이 있습니까?prepareForSegue ** 항상 ** 새로운 destinationViewController를 생성합니까?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"showSearchResult"]) { 
     TagsFeedViewController *destViewController = segue.destinationViewController; 
     destViewController.query = query; 
    } 
} 
+1

예 모든 세그먼트는보기 컨트롤러를 작성합니다.하지만보기 컨트롤러를 만들지 않으면 무엇을 사용합니까? –

답변

1

예, 이것은 단편에 대한 기본 동작입니다. 자세한 내용은 post을 참조하십시오.

+0

링크가 더 이상 유효하지 않습니다. – CupawnTae

17

각보기 컨트롤러는 – initWithIdentifier:source:destination: 메소드에 제공된보기 컨트롤러를 사용합니다. 대상보기 컨트롤러를 만드는 것은 단층이 아니라 스토리 보드입니다. the docs에서 :

일반적으로 스토리 보드에서보기 컨트롤러 인스턴스화하고 가 스토리 보드 자체 내에서 정의 된 작업에 대한 응답으로 자동으로 생성.

  • 서브 클래스 UIStoryboard :

그래서 당신은 몇 가지 옵션이 있습니다. 아마도 나쁜 생각입니다. UIStoryboard의 공용 인터페이스에는 세 가지 방법 만 있습니다. "스토리 보드 자체에 정의 된 동작"은 공개되지 않으며 사용자가 올바르게 작업 할 수 있도록 충분한 정보가 있다고 생각하지 않습니다.

  • 대상보기 컨트롤러를 싱글 톤으로 설정하십시오. 또 나쁜 생각입니다. general badness that singletons bring with them을 제외하고는 뷰가없고 뷰 뷰 컨트롤러가없는 뷰 컨트롤러를 유지할 필요가 없습니다. 그리고 귀하의보기 컨트롤러 클래스를 하나의 UIStoryboard를 속여서보기 컨트롤러 클래스의 특정 인스턴스를 사용하도록 만드는 것은 다소 어려워 보입니다.

  • 서브 클래스 UIStoryboardSegue. 자신 만의 segues를 만드는 경우 – initWithIdentifier:source:destination:에서 원하는 대상보기 컨트롤러를 무시하고 원하는 것을 사용하는 것을 포함하여 원하는 것을 할 수 있습니다. 이것은 여전히 ​​프레임 워크에 대해 작업하는 것처럼 보이며 대개 가난한 계획이지만 대상보기 컨트롤러의 특정 인스턴스를 반드시 사용해야하는 경우 이동하는 것이 더 좋은 방법 인 것 같습니다.

  • 흐름과 함께 진행하십시오. 최상의 옵션입니다. 기존 View Controller와의 연결을 원한다고 생각하는 이유를 생각해보십시오. 프레임 워크를 파괴하지 않고도 원하는 것을 성취 할 수있는 더 좋은 방법이 있을지 생각해보십시오. 예를 들어 이미 특정 상태가 있으므로 기존보기 컨트롤러를 사용 하시겠습니까? 모델을 뷰 컨트롤러가 아닌 상태로 유지하는 것이 더 나을 것입니다.

  • 0

    shouldPerformSegueWithIdentifier:sender: 메시지를 처리하여 컨트롤러를 만들지 못하게 할 수 있습니다.

    -(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender 
    { 
        if ([identifier isEqualToString:@"showSearchResult"]) { 
         return [self.results count] > 0; 
        } 
        return YES; 
    } 
    
    +1

    segue가 수행되는 것을 방지하여 컨트롤러 생성을 막는 것처럼 보입니다. 나는 그것이 OP가 성취하려고 시도한 것이라고 생각하지 않는다. – Caleb

    +0

    @Caleb 질문에 대한 오해가 있을지 모르지만 컨트롤러가없는 경우에는 컨트롤러없이 섹그를 실행할 이유가 없습니다. – Tassos

    +1

    OP가 Segue를 사용하여 새 컨트롤러를 만드는 대신 기존의보기 컨트롤러를 표시하려고한다고 생각합니다. 한 번씩. – Caleb

    관련 문제