2014-08-28 4 views
5

공유 확장에 대한 사용자 지정보기 컨트롤러를 만들려고했습니다.제시된보기 컨트롤러에서 extensionContext에 액세스

MainInterface.storyboard에 설정된 초기보기 컨트롤러 위에 다른보기 컨트롤러를 제시하면 혼란스러운 상황이 발생합니다. 이 프리뷰 컨트롤러는 네비게이션 컨트롤러에 내장되어 있습니다 (루트 컨트롤러입니다).

나는 그래서, 확장 문맥이 시점에서 무기 호입니다
(lldb) po [self presentingViewController] 

<_UIViewServiceViewControllerOperator: 0x7a978000> 

(lldb) po [[self presentingViewController] extensionContext] 

nil 

presentingViewController

에 체크를했다. presentingViewController에서 presentViewController로 전달하여 extensionContext에 액세스 할 수 있습니다.

하지만이 동작이 조금 이상하다는 것을 알았습니다. 앱 확장은 한 수준의보기 컨트롤러 계층에서만 액세스하도록 설계 되었습니까?

답변

2

확장 스토리 보드에서 두 개 이상의보기 컨트롤러를 사용하려면 원래보기 컨트롤러의 extensionContext에 대한 참조를보기 컨트롤러에 전달해야합니다.이 컨트롤러는 궁극적으로 완료 할 책임이 있습니다. 확장 프로그램의 요청. 초기 뷰 컨트롤러에서 : 당신이 extensionContext 이미 속성으로 존재하기 때문에, 원래의 확장 컨텍스트에 대한 고유 한 이름의 속성을 만들 필요가

@IBAction func dismissController(sender: UIButton!) { 
    dismissViewControllerAnimated(true) {() -> Void in 
     self.originalExtensionContext.completeRequestReturningItems(self.originalExtensionContext.inputItems, completionHandler: nil) 
} 

참고 :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    let destination = segue.destinationViewController as! FinalViewController 
    destination.originalExtensionContext = self.extensionContext 
} 

그리고 최종 뷰 컨트롤러에서

수퍼 클래스의 이름은 UIViewController입니다. UIViewController의 속성 extensionContext은 읽기 전용 속성이므로 기존의 extensionContext을 UIViewController의 속성 extensionContext에 전달할 수 없습니다.

+0

그래, 이것이 확장 컨텍스트를 전달하는 가장 확실한 방법이라고 생각했습니다. SDK의 extensionContext 속성의 동작에 대해 묻고있었습니다. –

+0

필자가 말할 수있는 한 (지금까지이 패턴을 두 번 사용했다.) 'extensionContext'에 대한 참조를 전달하면 비정상적인 동작이 발생하지 않는다. 마지막으로 할 일은'completeRequestReturningItems :'를 호출하는 것입니다. 그러면 확장 문맥을 해제 할 것이고 그 이후에 확장 기능 내에서 호출 된 것은 아무것도하지 않을 것입니다. –

1

보기 컨트롤러가 제공하는보기 컨트롤러는 상위 확장을 사용하여 문제가 없어야합니다. 문서에서 살펴보면 : 당신이 당신의 루트 뷰 컨트롤러는 참으로 extensionContext을 않는다는 사실을 확신 할 수 있다면,

The view controller can check this property to see if it participates in an extension request. If no extension context is set for the current view controller, the system walks up the view controller hierarchy to find a parent view controller that has a non nil extensionContext value.

따라서,이 뷰 컨트롤러에 의해 소개 된 어떠한 뷰 컨트롤러는에 액세스 할 수 있어야합니다 , 단순히 자신의 extensionContext 속성을 통해.

참고 : 다시 관찰하는 동작이 아니라면 SDK의 버그 일 수 있으며 레이더를 제출하는 것이 좋습니다.

+3

ViewController에 extensionContext가있는 부모가 있으면 올바르게 작동하지만 부모 - 자식 관계에 포함되지 않은 presentViewController 일 때는 다르게 동작합니다. –

+0

@JesseArmand가 맞습니다. 모달로 표시된 뷰에는 뷰 컨트롤러 extensionContext가 표시되지 않습니다. –