2012-03-26 3 views
26

당신은 팝 오버를 취소하고자하는 경우 -contentViewController 내에서 UIPopoverController를 닫으시겠습니까?

  1. 팝 오버에 대한 참조를 작성하는 것은 그것을
  2. 만들기를 생성 뷰 컨트롤러에 의해 개최되는 - 당신이해야하는 팝 오버의 contentViewController 내에서 버튼, 예를 들어 contentViewController에서 알림이 같은 목적
  3. 팝 오버는
  4. 전화를 기각 할 준비가되면 알림 또는 위임 메시지를 보내기위한 대리자를 만들 번갈아은 기각되어야한다고 소유 뷰 컨트롤러에게 알려, 또는하는 dismissPopover:animated 때 공고 기 또는 위임 방법은, 당신이 모달 뷰 컨트롤러, 부모 뷰 컨트롤러, 내비게이션 컨트롤러, 분할 뷰 컨트롤러, 탭 바 컨트롤러, 검색 디스플레이 컨트롤러에 액세스 할 수있는 UIViewController에서,

한편라고 하위보기 컨트롤러, 제시하는보기 컨트롤러 및 제시된보기 컨트롤러가 포함됩니다.

popover의 contentViewController에서 더 나은 방법이 있습니까?

답변

29

불행히도 콘텐트 뷰 컨트롤러 내에서 액세스 할 수있는 방법이 없기 때문에 안타깝게도 UIPopoverController에 약한 속성 참조를 만들어야합니다.

UIViewController가 모달보기 컨트롤러, 부모보기 컨트롤러, 탐색 컨트롤러, 분할보기 컨트롤러, 탭 표시 줄 컨트롤러, 검색 표시 컨트롤러 및 iOS 5의 자식보기 컨트롤러에 액세스 할 수있는 방법에 놀랐습니다. 뿐만 아니라 발표 컨트롤러를 제시하지만 ... popover 컨트롤러 (부여 popovers되지 않습니다 UIViewController지만 아직도).

기술적으로, UIViewController가있는 popoverController를 검색하는 비공개의 문서화되지 않은 메서드가 있습니다 ... 위의 컨트롤러 중 하나와 정확히 동일해야한다는 이유로 주어진 UI를 공개하지 않은 이유는 알 수 없습니다.

비록 개인적이고 문서화되지 않은 세계 에서조차도 dismissModalViewcontrollerAnimated:과 동등한 것이 없습니다. 그 참조를 얻은 다음에는 그런 식으로 해고해야합니다.

+1

문서를 검색 한 결과 나는 이것에 대해서도 놀랐습니다. 불행히도 이로 인해 원하지 않는 의존성이 추가됩니다. – Maurizio

+0

iOS8에서는 다음과 같은 선택을 할 수 있습니다 : self.popoverPresentationController – Jacky

1

이 문제를 해결하는 또 다른 방법은 경우 자신의 팝 오버 (들)을 닫습니다 -(void)closePopoverIfNecessary:(NSNotification*)notification과 같은 방법으로 NSNotification 관찰자를 추가합니다 (모든 뷰 컨트롤러) 추상적 인 뷰 컨트롤러를 생성하는 방법을 선택적으로 자식 클래스를 구현하는 것입니다 열다. 그런 다음 popover의 컨트롤러 내에서이를 닫기위한 알림을 발생시킵니다. 필요한 경우 알림 (userInfo)을 통해 다른 정보를 전달할 수도 있습니다.

이렇게하면 상위 참조가 필요 없습니다.

+0

이것을 사용하면 추상 컨트롤러의 'dealloc'에서 옵저버를 제거하는 것을 잊지 마십시오 –

관련 문제