如何在 ios 的共享扩展中访问 keyWindow?

Posted

技术标签:

【中文标题】如何在 ios 的共享扩展中访问 keyWindow?【英文标题】:How to access keyWindow in share extension in ios? 【发布时间】:2015-06-15 06:52:43 【问题描述】:

我需要在我的应用程序的共享扩展中访问 keyWindow - 添加一些指标视图 - 访问窗口的宽度和高度

我在共享扩展类中写了以下行:

UIWindow *mainWindow = [[UIApplication sharedApplication] keyWindow];

但是,它说“sharedApplication”不可用。 如何在共享扩展中访问 keyWindow?

需要您的宝贵建议。 提前致谢

【问题讨论】:

我阅读了答案,但我遇到了类似的问题。我不能子类化视图控制器,因为我有一个自定义 UIWindow 类,我想将它作为子视图添加到我的共享扩展中的“keyWindow”中。有人知道怎么做吗? 截至目前,“keyWindow”在共享扩展中不可用。尝试将您的自定义窗口添加到当前视图控制器的视图中,如果有,请禁用视图控制器导航栏的用户交互。我没有尝试过,但试一试。 【参考方案1】:

共享应用程序不适用于扩展。您不能从共享扩展访问关键窗口。您可以从 UINavigationController 子类化 ShareExtension 视图控制器,并且可以呈现模态视图控制器,然后也可以导航。在该模式视图控制器中,您可以添加活动指示器。

【讨论】:

【参考方案2】:
UIApplication *application = [UIApplication performSelector:@selector(sharedApplication)];
UIWindow *keyWindow = application.keyWindow;

然而,keyWindow 是 nil...

【讨论】:

【参考方案3】:

UIApplication 不可用于扩展。要添加指示器视图,您必须通过 UIViewController 堆栈执行此操作,但您可以获得屏幕大小,这可能就足够了,具体取决于确切的用例 (swift):

UIScreen.mainScreen().bounds.size

阅读more here 了解 [UIScreen mainScreen].bounds 与 [UIApplcation sharedApplication].keyWindow.bounds 之间的区别?

更新

使用 UIScreen 获取大小的另一种方法是导航视图层次结构。这适用于已布置视图的 UIView 或 UIViewController 中的任何位置。您还可以将指示器添加到最顶部的视图。

// Find the top most view
var view: UIView = self;
while let higherView = view.superview 
    view = higherView;


// Size you need
var size: CGSize = view.frame.size;

// Add the indicator
let indicator: UIView = UIView(frame: CGRectMake(100, 100, 100, 100));
indicator.backgroundColor = UIColor.orangeColor();
view.addSubview(indicator);
view.bringSubviewToFront(indicator);

【讨论】:

以上是关于如何在 ios 的共享扩展中访问 keyWindow?的主要内容,如果未能解决你的问题,请参考以下文章

如何与 iOS 扩展共享 Parse 登录会话?

如何在 iOS 共享扩展中获取屏幕截图?

如何在上传前在 iOS 共享扩展中缩小图像

如何在 iOS 中获取共享扩展的状态?

在IOS8中使用共享扩展时如何获取源应用程序的bundleId

如何在 iOS 应用程序和今日视图扩展程序之间共享数据