是否可以在共享扩展中打开完整视图控制器,而不是弹出窗口(默认)

Zoe*_*b S 2 iphone uitableview ios swift ios8-share-extension

我正在处理并且Share extension我有一个与此相关的查询。

是否有可能打开共享扩展全视图控制器,还可以再加UITableView或其他IBoutlet使用StoryboardShare extension

提前致谢

Zoe*_*b S 6

步骤 1:添加新UIViewController命名的MainPageViewController.

Step2:MainInterfaceStoryboard中添加新的View Controller,将它的类改为 MainPageViewController在Storyboard的Custom Class部分,在Identity部分设置Storyboard IDMainPageViewController

Step3: 打开 Share 扩展的 info.plist

默认情况下它看起来像这样 -

<key>NSExtension</key>
    <dict>
        <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionActivationRule</key>
            <string>TRUEPREDICATE</string>
        </dict>
        <key>NSExtensionMainStoryboard</key>
        <string>MainInterface</string>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.share-services</string>
    </dict>
Run Code Online (Sandbox Code Playgroud)

现在代替默认NSExtensionMainStoryboard密钥使用NSExtensionPrincipalClass密钥,因此最终结果将是

<key>NSExtension</key>
        <dict>
            <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionActivationRule</key>
            <string>TRUEPREDICATE</string>
        </dict>
            <key>NSExtensionPrincipalClass</key>
            <string>HomeViewController</string>
            <key>NSExtensionPointIdentifier</key>
            <string>com.apple.share-services</string>
        </dict>
Run Code Online (Sandbox Code Playgroud)

HomeViewController我们新的入口点控制器在哪里。

Step4:现在,最重要的是我们需要解决与模块命名相关的奇怪问题

要修复它,我们需要@objc(HomeViewController)HomeViewController文件顶部添加。

Step5:同样要为演示文稿添加动画,我们需要在viewWillAppear

请参阅以下参考代码:

import UIKit

@objc(HomeViewController)

class HomeViewController : UINavigationController {

     init() {
        let viewController:UIViewController = UIStoryboard(name: "MainInterface", bundle: nil).instantiateViewController(withIdentifier: "MainPageViewController") as UIViewController
        super.init(rootViewController: viewController)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
    }

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.size.height)

        UIView.animate(withDuration: 0.25, animations: { () -> Void in
            self.view.transform = CGAffineTransform.identity
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

MainPageViewController您的 标识符在哪里MainViewController,我们要展示它。

第6步:要关闭动画,我们可以在MainPageViewController类中创建新函数:

func hideExtensionWithCompletionHandler(completion:@escaping (Bool) -> Void) {
    UIView.animate(withDuration: 0.20, animations: {

        self.navigationController!.view.transform = CGAffineTransform(translationX: 0, y: self.navigationController!.view.frame.size.height)
    }, completion: completion)
}
Run Code Online (Sandbox Code Playgroud)

在保存或取消按钮和块内调用上面的函数,我们可以调用completeRequestcancelRequest(withError:)

func saveButtonTapped(sender: UIBarButtonItem) {
        self.hideExtensionWithCompletionHandler(completion: { (Bool) -> Void in
            self.extensionContext!.completeRequest(returningItems: nil, completionHandler: nil)
        })
    }
Run Code Online (Sandbox Code Playgroud)

现在,做任何你想做的人,做双重男人;-)