构建一个
watchOS
应用
429
16-13
在对象库中搜索
Interface Controller
”,
选中我们需要的常规
Interface
Controller
2.
拖曳一个界面控制器。
3.
选择它,打开
Identity Inspector
。把类由
WKInterfaceController
改为
NoteInterfaceController
,让它使用后者的代码。
4.
打开“
Attributes Inspector
”,把标题改为
Note
接下来,创建一个
segue
,把笔记列表界面控制器与笔记界面控制器连接起来。
1.
按住
Control
键,从
Note Row
(即表格视图中的行)拖曳到笔记界面控制器上。松
开鼠标后会弹出一个菜单,列出可用的
segue
(见图
16-14
)。选择“
Push
”。
16-14
创建 segue
430
16
另一个用于创建模式
segue
modal segue
,界面控制器从屏幕底部滑出。这种
segue
用于显示提醒或其他模式对话框。
2.
选择新创建的这个
segue
,打开“
Attributes Inspector
”。把标识符改为
ShowNote
现在可以设计笔记界面控制器的界面了。
1.
拖曳一个标注到笔记界面控制器中。
2.
打开“
Attributes Inspector
”,把“
Lines
”的值设为
0
。这样,标注的尺寸会根据文
本长度而变化。把行数设为
0
,标注会自行调整尺寸,以便显示整个文本,而不会
在特定的行数之后截断文本。
3.
把“
Text
”的值设为 Note Content。运行时,这个文本会被替换成笔记的内容。
现在,这两个界面控制器的外观如图
16-15
所示。
16-15
设计好的界面
最后,把笔记界面控制器中的标注与代码连接起来。
1.
在辅助编辑器中打开
NoteInterfaceController
。按住
Control
键,
Note Content
”标注拖曳到
NoteInterfaceController
类中。创建一个名为
noteContentLabel
outlet
2.
运行应用,轻点一个笔记。此时会转向这个新界面控制器。
下面,我们要让
NoteListInterfaceController
响应用户轻点单元格的操作,让它把所
选笔记的
URL
传给
NoteInterfaceController
。这样,
NoteInterfaceController
才能
请求文档的内容。
构建一个
watchOS
应用
431
为此,我们将实现
contextForSegueWithIdentifier
方法。用户轻点表格中的行时,
watchOS
会调用这个方法。这个方法应该返回一个上下文对象,类型不限;这个对象作
为参数传给下一个界面控制器的
awakeWithContext
方法。
1.
打开
NoteListInterfaceController.swift
,添加下述方法:
override func contextForSegueWithIdentifier(segueIdentifier: String,
inTable table: WKInterfaceTable, rowIndex: Int) -> AnyObject? {
//
ShowNote segue
吗?
if segueIdentifier == "ShowNote" {
//
把所选笔记的
URL
传给界面控制器
return SessionManager.sharedSession.notes[rowIndex].URL
}
return nil
}
这个方法的作用与
UIViewController
实现的
prepareForSegue
方法一样。它检查运行
segue
是不是
ShowNote
,如果是,传递用户所选笔记的
URL
2.
然后,在
NoteInterfaceController
类中实现
awakeWithContext
方法,让它使
用传来的
NSURL
请求笔记文本。
NoteInterfaceController
会把这个
NSURL
传给
SessionManager
,它再
传给
iPhone
,获取文档的内容。
3.
打开
NoteInterfaceController.swift
,参照下述代码更新
awakeWithContext
方法:
override func awakeWithContext(context: AnyObject?) {
//
希望收到了一个
NSURL
,指向
iPhone
中我们想显示的一个笔记
if let url = context as? NSURL {
//
首先,清空标注。
//
可能要等一会儿文本才会出现
self.noteContentLabel.setText(nil)
SessionManager.sharedSession.loadNote(url,
completionHandler: { text, error -> Void in
if let theText = text {
//
得到文本了,把它显示出来
self.noteContentLabel.setText(theText)
}
})
}
}
432
16
NoteInterfaceController
类的
awakeWithContext
方法中,
context
参数的值是
contextForSegueWithIdentifier
方法返回的任意对象。如果是
NSURL
对象,使用它
请求笔记的文本。得到文本之后,在
noteContentLabel
中把它显示出来。
4.
运行应用。轻点一个笔记后,会显示里面的内容(见图
16-16
)。
16-16
在列表中轻点一个笔记之后显示里面的文本
最后还有一件事要做。传输文本这一步可能失败,此时,我们应该显示一个提醒,告诉
用户出错了。
把下述代码添加到
awakeWithContext
方法中:
override func awakeWithContext(context: AnyObject?) {
//
希望收到了一个
NSURL
,指向
iPhone
中我们想显示的一个笔记
if let url = context as? NSURL {
//
首先,清空标注
//
可能要等一会儿文本才会出现
self.noteContentLabel.setText(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
构建一个
watchOS
应用
433
> self.popController()
> })
>
> self.presentAlertControllerWithTitle("Error loading note",
> message: theError.localizedDescription,
> preferredStyle: WKAlertControllerStyle.Alert,
> actions: [closeAction])
>
> return
> }
if let theText = text {
//
得到文本了,把它显示出来
self.noteContentLabel.setText(theText)
}
})
}
}
传给
loadNote
的完成句柄,其参数是文本内容或一个
NSError
对象。如果出错了,调用
presentAlertControllerWithTitle
方法
,显示提醒界面控制器。
这里没有使用
do-catch
结构,因为错误来自这个方法之外,而不是由调用方法抛出的。
再次运行应用,如果显示笔记的内容时出错了,会出现一个提醒(见图
16-17
)。
16-17
显示笔记内容时如果出错了
出现提示

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

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