我尝试为共享扩展程序创建自定义视图控制器。
当我在MainInterface.storyboard
上设置的初始视图控制器上呈现另一个视图控制器时,会出现令人困惑的情况。这个呈现的视图控制器嵌入在导航控制器中(它是它的根视图控制器)。
我检查了presentViewController
(lldb) po [self presentingViewController]
<_UIViewServiceViewControllerOperator: 0x7a978000>
(lldb) po [[self presentingViewController] extensionContext]
nil
因此,此时扩展上下文为零。我可以通过将它从presentViewController传递给presentViewController来访问extensionContext
。
但是,我发现这种行为有点奇怪。应用程序扩展是否仅设计为从一级视图控制器层次结构访问?
答案 0 :(得分:5)
如果您要在扩展程序板中使用多个视图控制器,则必须将对原始视图控制器的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
,因为它是一个只读属性。
答案 1 :(得分:1)
视图控制器呈现的视图控制器在使用父扩展时应该没有问题。看一下文档:
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
,则此视图控制器提供的任何视图控制器都应该可以访问它,只需通过它自己的{{1} } property。
注意:如果这不是你要观察的行为,这可能是SDK的一个错误,我建议你提交雷达。
答案 2 :(得分:1)
虽然这不是干净代码和体系结构的最佳方法,但非常方便:
在存在extensionContext
的根扩展控制器中:
final class ShareRootViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NSExtensionContext.shared = self.extensionContext
}
}
extension NSExtensionContext {
fileprivate(set) static var shared: NSExtensionContext!
}
在任何其他视图控制器中:
let context = NSExtensionContext.shared