簡體   English   中英

從呈現的視圖控制器訪問extensionContext

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM