我已经尝试为共享扩展创建自定义视图控制器.
当我在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,因为它是一个只读属性.