从呈现的视图控制器访问extensionContext

Jes*_*and 6 ios ios8 ios-app-extension

我已经尝试为共享扩展创建自定义视图控制器.

当我在设置的初始视图控制器上呈现另一个视图控制器时,会出现令人困惑的情况MainInterface.storyboard.这个呈现的视图控制器嵌入在导航控制器中(它是它的根视图控制器).

我对presentViewController进行了检查

(lldb) po [self presentingViewController]

<_UIViewServiceViewControllerOperator: 0x7a978000>

(lldb) po [[self presentingViewController] extensionContext]

nil
Run Code Online (Sandbox Code Playgroud)

因此,此时扩展上下文为零.我可以extensionContext通过将它从presentViewController传递给presentViewController来访问它.

但是,我发现这种行为有点奇怪.应用程序扩展是否仅设计为从一级视图控制器层次结构访问?

小智 5

如果您要在扩展故事板中使用多个视图控制器,则必须将对extensionContext原始视图控制器的引用传递给最终负责完成扩展请求的视图控制器.在初始视图控制器中:

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

在你的最终视图控制器中:

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

请注意,您必须为原始扩展上下文创建唯一命名的属性,因为extensionContext已经作为超类的属性名称存在UIViewController.您不能将现有extensionContext属性传递给UIViewController的属性,extensionContext因为它是只读属性.