[英]Accessing extensionContext from a presented view controller
我已經嘗試為共享擴展創建自定義視圖控制器。
當我在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
因為它是一個只讀屬性。
視圖控制器呈現的視圖控制器使用父擴展時應該沒有問題。 看一下文檔:
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
,則此視圖控制器提供的任何視圖控制器都應該可以訪問它,只需通過它自己的extensionContext
屬性即可。
注意:如果這不是您需要觀察的行為,這可能是SDK的錯誤,我建議您提交雷達。
雖然它不是清潔代碼和架構的最佳方法,但它非常方便:
在存在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.