[ios] 부모 iOS에서 컨테이너 뷰 컨트롤러에 액세스

iOS6에서 새로운 컨테이너보기를 발견했지만 포함보기에서 컨트롤러에 액세스하는 방법을 잘 모르겠습니다.

대본:

예

컨테이너보기가있는보기 컨트롤러에서 경고보기 컨트롤러의 레이블에 액세스하고 싶습니다.

그들 사이에 segue가 있는데, 그것을 사용할 수 있습니까?



답변

예. segue를 사용하여 하위 뷰 컨트롤러 (및 해당 뷰 및 하위 뷰)에 액세스 할 수 있습니다. alertview_embed스토리 보드의 속성 관리자를 사용하여 segue에 식별자 (예 :)를 제공하십시오 . 그런 다음 부모보기 컨트롤러 (컨테이너보기를 수용하는 컨트롤러)에게 다음과 같은 방법을 구현하십시오.

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
   NSString * segueName = segue.identifier;
   if ([segueName isEqualToString: @"alertview_embed"]) {
       AlertViewController * childViewController = (AlertViewController *) [segue destinationViewController];
       AlertView * alertView = childViewController.view;
       // do something with the AlertView's subviews here...
   }
}


답변

당신은 단순히 다음과 같이 할 수 있습니다 self.childViewControllers.lastObject(자녀가 하나 있다고 가정하면 그렇지 않으면 사용하십시오 objectAtIndex:).


답변

스위프트 프로그래밍

이렇게 쓸 수 있습니다

var containerViewController: ExampleViewController?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // you can set this name in 'segue.embed' in storyboard
    if segue.identifier == "checkinPopupIdentifierInStoryBoard" {
        let connectContainerViewController = segue.destinationViewController as ExampleViewController
        containerViewController = connectContainerViewController
    }
}


답변

prepareForSegue접근 방식은 작동하지만 segue 식별자 매직 문자열을 사용합니다. 더 좋은 방법이있을 수 있습니다.

VC의 클래스를 알고 있다면 계산 된 속성으로 매우 깔끔하게 수행 할 수 있습니다.

var camperVan: CamperVanViewController? {
  return childViewControllers.flatMap({ $0 as? CamperVanViewController }).first
  // This works because `flatMap` removes nils
}

에 의존합니다 childViewControllers. 첫 번째 수업에 의존하는 것은 깨지기 쉬울 수 있지만 동의하는 수업의 이름을 지정하면 이것이 상당히 견고 해 보입니다.


답변

계산 된 속성을 사용하여 Swift 3에 대한 업데이트 된 답변 :

var jobSummaryViewController: JobSummaryViewController {
    get {
        let ctrl = childViewControllers.first(where: { $0 is JobSummaryViewController })
        return ctrl as! JobSummaryViewController
    }
}

이는 첫 번째 일치 항목에 도달 할 때까지 하위 목록 만 반복합니다.


답변

self.childViewControllers 부모의 통제가 필요할 때 더 관련이 있습니다. 예를 들어 자식 컨트롤러가 테이블보기이고이를 강제로 다시로드하거나 부모 탭 컨트롤러의 다른 이벤트 또는 버튼 탭을 통해 속성을 변경하려는 경우에는 PrepareForSegue가 아닌 ChildViewController의 인스턴스에 액세스하여이를 수행 할 수 있습니다. 둘 다 다른 방식으로 응용 프로그램을 가지고 있습니다.


답변

뷰 컨트롤러의 유형에 Swift의 switch 문을 사용하는 다른 방법이 있습니다.

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
  switch segue.destination
  {
    case let aViewController as AViewController:
      self.aViewController = aViewController
    case let bViewController as BViewController:
      self.bViewController = bViewController
    default:
      return
  }
}