是否可以在共享扩展中打开全视图控制器,而不是弹出窗口(默认)
Posted
技术标签:
【中文标题】是否可以在共享扩展中打开全视图控制器,而不是弹出窗口(默认)【英文标题】:Is it possible to open full view controller in Share extension, instead of popup (default) 【发布时间】:2017-10-31 05:13:01 【问题描述】:我正在处理 Share extension
并且我有一个与此相关的查询。
是否可以在共享扩展中打开全视图控制器,也可以在Share extension
中使用Storyboard
添加UITableView
或其他IBoutlet
。
提前致谢
【问题讨论】:
是的,whatsapp 就是这样做的。 检查一下,这是 swift 的旧版本,但您可以从中获得帮助。 github.com/martinnormark/ShareByMail 【参考方案1】:第一步:添加新的UIViewController
,命名为MainPageViewController
。
步骤 2: 在 MainInterface
Storyboard 中添加新的 View Controller,在 Storyboard 的 Custom Class 部分将其类更改为 MainPageViewController
,将 Storyboard ID
设置为 @987654327 @ 在身份部分。
第 3 步: 打开 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>
现在代替默认的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>
HomeViewController
是我们的新入口点控制器。
第四步:现在,最重要的我们需要fix weird issue related with module naming。
要修复它,我们需要在 HomeViewController
文件的顶部添加 @objc(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
)
其中MainPageViewController
是您的MainViewController
的标识符,我们要展示它。
第六步:我们可以在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)
在保存或取消按钮和块内调用上面的func,我们可以调用completeRequest
或cancelRequest(withError:)
func saveButtonTapped(sender: UIBarButtonItem)
self.hideExtensionWithCompletionHandler(completion: (Bool) -> Void in
self.extensionContext!.completeRequest(returningItems: nil, completionHandler: nil)
)
现在,做任何你想做的人,做双重人;-)
【讨论】:
以上是关于是否可以在共享扩展中打开全视图控制器,而不是弹出窗口(默认)的主要内容,如果未能解决你的问题,请参考以下文章
百度统计 可以统计页面上的JS的弹出窗的打开次数吗? 怎么实现?
Pycharm、Spyder、Jupyter notebook“弹出窗绘图”和“控制台绘图”设置