我已经尝试为共享扩展创建自定义视图控制器.
当我在MainInterface.storyboard上设置的初始视图控制器上呈现另一个视图控制器时,会出现令人困惑的情况.这个呈现的视图控制器嵌入在导航控制器中(它是它的根视图控制器).
我对presentViewController进行了检查
(lldb) po [self presentingViewController] <_UIViewServiceViewControllerOperator: 0x7a978000> (lldb) po [[self presentingViewController] extensionContext] nil
因此,此时扩展上下文为零.我可以通过将它从presentsViewController传递给presentViewController来访问extensionContext.
但是,我发现这种行为有点奇怪.应用程序扩展是否仅设计为从一级视图控制器层次结构访问?
解决方法
如果您要在扩展故事板中使用多个视图控制器,则必须将对原始视图控制器的extensionContext的引用传递给最终负责完成扩展请求的视图控制器.在初始视图控制器中:
override func prepareForSegue(segue: UIStoryboardSegue,sender: AnyObject?) { let destination = segue.destinationViewController as! FinalViewController destination.originalExtensionContext = self.extensionContext }
在你的最终视图控制器中:
@IBAction func dismissController(sender: UIButton!) { dismissViewControllerAnimated(true) { () -> Void in self.originalExtensionContext.completeRequestReturningItems(self.originalExtensionContext.inputItems,completionHandler: nil) }
请注意,您必须为原始扩展上下文创建唯一命名的属性,因为extensionContext已作为超类UIViewController上的属性名存在.您不能将现有的extensionContext传递给UIViewController的属性extensionContext,因为它是一个只读属性.