434
16
16.3.4
新建笔记
接下来,为这个
Apple Watch
应用添加新建笔记功能。我们将通过一个菜单项实现这个
操作:当用户在笔记列表屏幕按压屏幕时(即在手表表面用力按),弹出一个按钮,让
用户编写新的笔记。如果用户轻点那个按钮,手表会让用户通过语音输入文本写完之后,
NoteListInterfaceController
把文本发给
iPhone
,新建笔记。
Apple Watch
中只能通过语音识别输入文本。
首先,创建那个菜单项。
1.
打开
Interface.storyboard
文件。
2.
在对象库中搜索“
Menu
”,然后拖曳到
NoteListInterfaceController
上。
3.
选择自动添加的菜单项,然后打开“
Attributes Inspector
”。
4.
把图像设为
Add,把标题设为 Create Note
5.
按住
Control
键,从菜单项拖曳到
NoteListInterfaceController
类中。创建一个名
createNote
的动作。
6.
把下述代码添加到
createNote
方法中:
@IBAction func createNote() {
let suggestions = [
"Awesome note!",
"What a great test note!",
"I love purchasing and reading books from O'Reilly Media!"
]
self.presentTextInputControllerWithSuggestions(suggestions,
allowedInputMode: WKTextInputMode.Plain) {
(results) -> Void in
if let text = results?.first as? String {
SessionManager
.sharedSession
.createNote(text, completionHandler: { notes, error in
self.updateListWithNotes(notes)
})
}
}
构建一个
watchOS
应用
435
}
这个方法显示一个文本输入视图控制器,让用户从我们提供的选项数组中选择,或者通
过听写输入。
如果
suggestions
列表的值为
nil
,文本输入控制器会直接进入听写模式,也就是
没有选项可选。模拟器不支持听写,因此如果没有实体设备做测试,应该提供一些
建议选项。
7.
运行应用,在笔记列表上用力按,开始听写。输入完成后,会新建一个笔记(见图
16-18
)。
16-18
用力按弹出的菜单
16.3.5
Apple Watch
iPhone
之间添加
Handoff
接下来添加在
Apple Watch
iPhone
之间切换的功能。如果用户在手表上查看笔记时
打开
iPhone
,屏幕左下角会显示一个
Handoff
图标;如果用户向上轻扫图标,文档会在
iOS
应用中打开。
这个功能与
iPhone
Mac
之间实现
Handoff
使用的是同一个系统:手表广播一个用户
活动,如果用户决定在手机上继续活动,二者交换信息。
Apple Watch
iPhone
之间的
Handoff
有个难题:在
Mac
iPhone
,可以利用
436
16
NSDocument
UIDocument
让它们传递文档的
URL
但是现在我们要自行处理。因此,
我们要在手表中的用户活动里添加一点额外信息,以便在
iPhone
中找到相应的信息。
只有物理设备支持
Handoff
。如果想测试,必须构建应用,在
Apple Watch
iPhone
备中运行。
1.
打开
DocumentCommon.swift
2.
把下面这行代码添加到文件中:
let WatchHandoffDocumentURL = "watch_document_url_key"
从手表切换到其他设备时,我们将使用这个键查找文档的
URL
3.
然后,打开
DocumentListViewController.swift
,把下述代码添加到
restoreUserActivityState
方法中:
override func restoreUserActivityState(activity: NSUserActivity) {
//
要求打开一个文档
if let url = activity.userInfo?[NSUserActivityDocumentURLKey]
as? NSURL {
//
打开文档
self.performSegueWithIdentifier("ShowDocument", sender: url)
}
> //
从手表转到这里
> if let urlString = activity
> .userInfo?[WatchHandoffDocumentURL] as? String,
> let url = NSURL(string: urlString) {
> //
打开文档
> self.performSegueWithIdentifier("ShowDocument", sender: url)
> }
//
从搜索结果转到这里
if let searchableItemIdentifier = activity
.userInfo?[CSSearchableItemActivityIdentifier] as? String,
let url = NSURL(string: searchableItemIdentifier) {
//
打开文档
self.performSegueWithIdentifier("ShowDocument", sender: url)
}
}
如果切换字典中有
WatchHandoffDocumentURL
键,我们从中提取
URL
,然后打开对
应的文档。
构建一个
watchOS
应用
437
最后,让
NoteInterfaceController
告知其他设备,用户正在查看文档。此时,在其他
设备的锁屏(
iOS
设备)或
Dock
Mac
)中会显示应用的图标。
1.
打开
NoteInterfaceController.swift
,把下述代码添加到
awakeWithContext
方法中:
override func awakeWithContext(context: AnyObject?) {
//
希望收到了一个
NSURL
,指向
iPhone
中我们想显示的一个笔记
if let url = context as? NSURL {
//
首先,清空标注
//
可能要等一会儿文本才会出现
self.noteContentLabel.setText(nil)
> let activityInfo = [WatchHandoffDocumentURL: url.absoluteString]
>
> //
注意,这个字符串要与你在
iOS
Mac
应用的
> // Info.plist
文件中定义的活动类型相同
> updateUserActivity("au.com.secretlab.Notes.editing",
> userInfo: activityInfo, webpageURL: nil)
SessionManager.sharedSession.loadNote(url,
completionHandler: { text, error -> Void in
if let theError = error {
//
遇到错误。
//
把错误显示出来,再添加一个按钮,轻点后关闭这个屏幕
let closeAction = WKAlertAction(title: "Close",
style: WKAlertActionStyle.Default,
handler: { () -> Void in
self.popController()
})
self.presentAlertControllerWithTitle("Error loading note",
message: theError.localizedDescription,
preferredStyle: WKAlertControllerStyle.Alert,
actions: [closeAction])
return
}
if let theText = text {
//
得到文本了,把它显示出来
self.noteContentLabel.setText(theText)
}
})
}
}
438
16
首先,创建一个包含笔记
URL
的字典。然后,调用
updateUserActivity
方法,发
出广播,指明用户正在其他设备中阅读某个文档。
2.
Apple Watch
中运行应用,打开一个笔记。打开
iPhone
,在屏幕左下角会看到
iOS
应用的图标。向上轻扫,
iOS
应用会打开你在手表中查看的那个文档(见图
16-
19
)。
Dock
中也能看到
Mac
应用的图标,外加一个
Apple Watch
图标。这表明,除了
可以切换到
iPhone
之外,还能切换到
Mac
16-19
iPhone 主屏幕和 Mac Dock 中显示的 Handoff 图标

Get Swift学习手册 now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.