3

ゴルフのストロークを記録して保存し、iPhone でスコアを表示できるようにするアプリケーションを作成しています。問題は、アプリがセカンダリ ビュー コントローラーを起動して開いた後にメッセージを受信する一方で、セカンダリ ビュー コントローラーを閉じるとメッセージのリッスンを停止することです。その後、セカンダリ ビュー コントローラーに切り替えると、再度閉じるまでメッセージをリッスンします。セカンダリView Controllerが開かれるまでルートView Controllerがリッスンする理由がわかりません。

sendMessageデバイス間でストローク数を転送するために、対応する受信機能を使用しています。各View Controllerにはメッセージ受信機能が含まれています。

問題のコードは次のとおりです。

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")
    }

定数と if ステートメントは、18 ホールすべてに適用されます。

以下を使用して、セカンダリ ビュー コントローラーを閉じています。

@IBAction func backButton(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: {});
}
4

1 に答える 1

2

この回答で説明されているように、WCSession は一度に 1 つのデリゲートのみをサポートします。

ビューコントローラー内でセッションを設定しているため、別のビューコントローラーをロードするとセッションデリゲートが変更されます。セカンダリ コントローラーを閉じることはできますが、それはセッションのデリゲートのままです。

これが、セッション デリゲートではなくなったため、ルート ビュー コントローラーがメッセージを受信しなくなった理由です。

Apple エンジニアが推奨するアプローチ:

以前の回答と開発者フォーラムの投稿が示唆しているように、電話の AppDelegate でアクティブ化するセッション ラッパーを作成し、時計からアプリ全体のメッセージを処理してから、データ ストアを更新するか、そのデータを直接オブザーバー。

一般に、Watch Connectivity をできるだけ早く (特定のビュー コントローラーではなく、起動時に) セットアップすることをお勧めします。

オフサイト チュートリアル:

Natasha The Robot には、Watch Connectivity セッション マネージャーとデータ ソースの使用方法を詳細に説明する優れたチュートリアルがあります。

于 2016-04-14T23:32:02.973 に答える