我正在编写一个应用程序,允许我记录我的高尔夫笔划并保存它们,以便我可以在iPhone上查看分数。问题是,虽然应用程序在启动并打开辅助视图控制器后确实会收到消息,但它会在解除任何辅助视图控制器后停止侦听消息。如果我然后切换到辅助视图控制器,它将侦听消息,直到我再次关闭它。我不知道为什么根视图控制器只会在打开辅助视图控制器之前监听。
我正在使用sendMessage
及其相应的接收函数来传输设备之间的stokes数。每个视图控制器都包含接收消息功能。
有问题的代码如下:
import UIKit // or WatchKit on Apple watch
import WatchConnectivity
class ViewController: UIViewController, WCSessionDelegate {
var session: WCSession!
let userData = NSUserDefaults.standardUserDefaults()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
ScrollHoles.contentSize = CGSize(width: 360,height: 1090)
if (WCSession.isSupported()){
self.session = WCSession.defaultSession()
self.session.delegate = self
self.session.activateSession()
userData.synchronize()
}
}
发送消息功能是......
// Save Data From Strokes To standatdUserDefaults.
@IBAction func SaveButton(sender: AnyObject) {
let hole1Score = Strokes1.text;
userData.setObject(hole1Score, forKey: "hole1Strokes")
userData.synchronize()
session.sendMessage(["score1A": hole1Score!], replyHandler: nil, errorHandler: nil) // score1A becomes score1B on Apple watch
}
并且接收消息功能是......
// Recieve Data from Apple Watch And Save It To standardUserDefaults (e.g. # of strokes).
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
let hole1Msg = message["score1B"] as? String // score1B becomes score1A on apple watch
let hole2Msg = message["score2B"] as? String
if (hole1Msg != nil){
userData.setObject(hole1Msg, forKey: "hole1Strokes")
}
if (hole2Msg != nil){
userData.setObject(hole2Msg, forKey: "hole2Strokes")
}
对于所有18个洞,常量和if语句都会继续。
我使用以下内容来关闭辅助视图控制器。
@IBAction func backButton(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: {});
}
答案 0 :(得分:1)
如this answer中所述,WCSession一次只支持一个代理。
由于您在视图控制器中设置会话,因此在加载另一个视图控制器时会话委托会发生变化。虽然你可能会关闭辅助控制器,但它仍然是会话的代表。
这就是您的根视图控制器不再接收消息的原因,因为它不再是会话委托。
Apple工程师的推荐方法:
如上一个答案和developer forum posts建议的那样,您可以创建一个会话包装器,您可以在手机的AppDelegate中激活它,让它从您的手表处理应用程序范围的消息,然后更新数据存储,或直接将数据传递给观察者。
通常,尽快设置Watch Connectivity是有利的(在启动时,而不是在特定的视图控制器中)。
场外教程:
Natasha The Robot有an excellent tutorial,它详细介绍了使用Watch Connectivity会话管理器和数据源。