今日扩展:得分小部件

分数小部件是可重用的组件,可用于通过“今日扩展”显示任何游戏的分数和其他详细信息。 使用Today Extension扩展您的容器应用程序,即使您的手机被锁定,也可以让用户参与其中。 让我们看看如何使用这个很酷的小部件。

首先从下面提到的GitHub存储库下载ScoreWidget的zip文件。

pallavtrivedi03 / TodayExtension-ScoreWidget
TodayExtension-ScoreWidget –可重用的代码片段,用于使用Today Extension扩展iOS应用。 github.com

在项目中导入分数小部件文件

为您的Xcode项目添加一个新目标(即今天的扩展),并导入Score Widget文件。 只需解压缩ScoreWidget.zip,然后将解压缩的文件夹放在目标层次结构下。

注意:添加文件时,请确保选择“如果需要,请复制”,然后选择扩展名作为目标。

添加分数小部件视图

将Today Extension目标添加到项目后,XCode会自动生成TodayViewController.swiftMainInterface.storyboard。

转到MainInterface.storyboard并从TodayViewControllerScene中删除Label。 我们不需要XLabel,因为我们拥有用于得分小部件视图的XIB。

接下来,我们需要将XIB作为子视图添加到TodayViewControllerScene。 为此,将以下内容添加为TodayViewController类的第一行。

var scoreWidgetView:ScoreWidgetView?

实例化声明的变量,并使用以下代码添加为子视图。

scoreWidgetView = ScoreWidgetView()。loadNib()为? ScoreWidgetView
scoreWidgetView?.frame = self.view.frame
self.view.addSubview(scoreWidgetView!)

这就是您的viewDidLoad()的外观。

我们完成了实例化自定义视图并将其添加为子视图的操作。 现在,让我们在“显示更多/显示更少”按钮上处理视图的放大和缩小。

处理视图的扩大和缩小

要添加“显示更多/显示更少”按钮,请在viewDidLoad中添加以下几行。

如果#available(iOSApplicationExtension 10.0,*)
{
extensionContext?.widgetLargestAvailableDisplayMode = .expanded
}其他
{
//早期版本的后备
}

“ widgetLargestAvailableDisplayMode”的值决定是否可以扩展窗口小部件。 现在,您的viewDidLoad()应该看起来像

添加以上行将在我们的小部件上启用“显示更多”按钮。 接下来,当用户点击“显示更多”按钮时,我们需要处理扩展和收缩。

为此,我们将实现一个委托方法,即widgetActiveDisplayModeDidChange(_ activeDisplayMode:NCWidgetDisplayMode,withMaximumSize maxSize:CGSize)。 添加以下方法。

在这里,每当activeDisplayMode的值更改时,我们都会分配一个新帧。 当用户点击以下行中的较少显示时,我们还将隐藏详细信息视图。

self.scoreWidgetView?.shouldDetailInfoViewBeHidden(state:(activeDisplayMode == .expanded)?false:true)

在小部件中填充数据

我们完成了大部分的工作。 现在剩下的唯一事情就是填充分数小部件中的数据。 为此,您需要一个类GameDataModel的对象 使用要在小部件中查看的数据实例化GameDataModel的对象。

为了使事情简单,在这里我使用一个包含两个GameDataModel对象的数组。 您可以根据需要使用任何数据结构来填充数据。

现在我们已经在数组中填充了数据,让我们将其放在视图中。 为此,我们有方法viz。 populateViewWith(data:GameDataModel,viewType:ViewType)

您需要将GameDataModel的对象作为第一个参数传递,并将视图类型作为第二个参数传递。

视图类型是具有两种情况的枚举,即BasicInfo和DetailInfo。 它们分别只是窗口小部件的上视图和窗口小部件的下视图。

让我们为scoreWidgetView调用此方法,并传递刚刚填充的数据。

这就是所有需要的。 运行项目,您应该看到小部件工作正常。

将窗口小部件深链接到容器应用程序怎么样?

点击小部件打开容器应用

用户点击窗口小部件后,我们希望他导航到容器应用程序并进入包含所点击游戏详细信息的屏幕。 这可以通过深层链接来实现。

要了解用户在窗口小部件上的点击,Score Widget提供了一些委托方法。 您需要做的就是确认DeeplinkHandlerDelegate协议。

为此,编写TodayViewController的扩展,实现DeeplinkHandlerDelegate,并在提示添加协议存根的消息时对XCode说是。

解决此问题后,XCode将为您编写委托方法。 现在,将以下行添加到委托方法的实现中。

let url = URL(字符串:“一些基本信息屏幕的深层链接网址”)
self.extensionContext?.open(url!,complementHandler:无)

您的扩展程序看起来像。

注意:将字符串“基本信息屏幕的某些Deeplink URL”替换为您的Deeplink URL。

剩下的最后一件事是将委托设置为self。 转到viewDidLoad()并添加以下行

scoreWidgetView?.delegate =自我

在实例化scoreWidgetView的行之后。

运行项目,然后单击小部件。 如果您输入的Deeplink URL正确,则应导航到容器应用程序。

而已。 🙂

快乐编码!

从下载分数小工具和示例项目

pallavtrivedi03 / TodayExtension-ScoreWidget
TodayExtension-ScoreWidget –可重用的代码片段,用于使用Today Extension扩展iOS应用。 github.com