3

私のアプリでは、「TicketDetailViewController」という名前のこのページがあり、そこには 3 つのラベルと、前のページのデータが表示される imageView があります。「sendtowatch」ボタンをクリックすると、表示されたデータ、つまり3つのラベルとimageViewをApple Watchに送信したいのですが、3つのラベルとimageViewをストーリーボードに取りました。問題は、データの保存と取得に FMDB データベースを使用していることです。IOS アプリからボタンをクリックすると、表示されたデータがデータベースに保存されます。同時に、データベースに保存した最新のデータを時計が受信できるように、データを取得する必要があります。私は解決策を試しましたが、うまくいきません。

これは、実行中のアプリのスクリーンショットの下にある、実行中のアプリのページの スクリーンショットです。

IOS 側からの私のソース コードは次のとおりです。

 @IBAction func sendToWatch(sender: AnyObject) {


    let ticketDB = FMDatabase(path: databasePath as String)
    if ticketDB.open()
    {

        let insertSQL = "INSERT INTO TICKET (image, ticket_category, ticket_type, date, time) VALUES ('\(display_image.image!)', '\(ticket_category.text!)', '\(ticket_type_name.text!)', '\(ticket_date.text!)', '\(ticket_time.text!)')"

        let result = ticketDB.executeUpdate(insertSQL,withArgumentsInArray: nil)

        if !result
        {

            print("Error: \(ticketDB.lastErrorMessage())")

        } else
        {

            let alt = PMAlertController(title: "Success!", description: "Your data is saved to Database!", image: UIImage(named: ""), style: .Alert)

            alt.addAction(PMAlertAction(title: "OK!", style: .Default, action:
                { (ACTION) -> Void in
                    let ticketInfo = NSMutableDictionary()
                    let ticketDB = FMDatabase(path: self.databasePath as String)
                    if ticketDB.open()
                    {

                        let querySQL = "SELECT * FROM TICKET"

                        let result: FMResultSet? = ticketDB.executeQuery(querySQL, withArgumentsInArray: nil)

                        if let result = result
                        {
                            self.ticketDataArray = NSMutableArray()
                            while result.next()
                            {

                                ticketInfo["ticket_category"] = self.ticket_category.text
                                ticketInfo["ticket_type"] = self.ticket_type_name.text
                                ticketInfo["date"] = self.ticket_date.text
                                ticketInfo["time"] = self.ticket_time.text
                                ticketInfo["image"] = self.display_image.image
                                print("Data: \(ticketInfo)")

                            }
                            let dict = ["Watchdat":ticketInfo]

                            self.session.sendMessage(dict, replyHandler: { (replayDic: [String:AnyObject]) -> Void in
                                print(replayDic["Watchdat"])
                                }, errorHandler: { (error:NSError) -> Void in
                                    print(error.description)
                            })

                        }else
                        {
                            print("Error: \(ticketDB.lastErrorMessage())")

                        }

                    ticketDB.close()

                    }


            }))

            self.presentViewController(alt, animated: true, completion: nil)
            print(databasePath)

        }
    }

時計側からの私のソースコードは以下です

class InterfaceController: WKInterfaceController, WCSessionDelegate {

var session: WCSession!



@IBOutlet var watch_displayImage: WKInterfaceImage!
@IBOutlet var watch_ticket_category: WKInterfaceLabel!
@IBOutlet var watch_ticketType: WKInterfaceLabel!
@IBOutlet var watch_ticketTime: WKInterfaceLabel!
@IBOutlet var watch_ticketDate: WKInterfaceLabel!

override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)

    if WCSession.isSupported()
    {

        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()

    }


}

override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()


}


func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) {
    print(message.values)

    var dict = Dictionary<String,AnyObject>()
    watch_ticket_category.setText(dict["Watchdat"]! as? String)
}

}

4

1 に答える 1

1

iOS 側:

チケットの配列を作成するのに時間を費やしますが、その配列に対しては何もしません。チケット辞書の配列を渡す代わりに、単一のチケットの辞書を渡しました。

let ticketInfo = NSMutableDictionary()
...
self.ticketDataArray = NSMutableArray()
while result.next()
{
    ticketInfo.setObject(result.stringForColumn("image"), forKey: "image")
    ticketInfo.setObject(result.stringForColumn("ticket_category"), forKey: "ticket_category")
    ticketInfo.setObject(result.stringForColumn("ticket_type"), forKey: "ticket_type")
    ticketInfo.setObject(result.stringForColumn("date"), forKey: "date")
    ticketInfo.setObject(result.stringForColumn("time"), forKey: "time")
    self.ticketDataArray.addObject(ticketInfo)
}
let dict = ["Watchdat":ticketInfo]

配列の作成を省略するか、そのキーに適切な値を渡す必要があります。

watchOS 側:

var dict = Dictionary<String,AnyObject>()
watch_ticket_category.setText(dict["Watchdat"]! as? String)

チェックしている辞書は、作成したばかりの新しい空の辞書です。ただし、時計が受信した電話のデータはパラメーターで渡されdidReceiveMessageました。そのmessage辞書を調べれば、あなたが期待していることがわかるはずです。

「Watchdat」キーの値は、条件付きで文字列にキャストできないことに注意してください。キーの値が辞書または配列のどちらであるかに応じて、それを修正する必要もあります。

コードが現在記述されているように、ネストされたディクショナリにするつもりなら、次のように各ラベルを設定する必要があります。

watch_ticket_category.setText(message["Watchdat"]!["ticket_category"])

画像について:

レコードの画像列の型は文字列ですが、ウォッチにWKInterfaceImage. 画像を時計に渡すつもりだった場合は、iOS 側でもそのコードを修正する必要があります。

SOには、画像を時計に転送する方法を説明する多くの回答があります。心に留めておくべきことは、次の 2 つです。

  • 画像のサイズ。小さな時計画面に表示される高解像度画像を転送するために時間とバッテリー寿命を無駄にしないでください。転送するに画像を拡大縮小します。

  • sendMessage特に単一のチケットではなく、チケット (および画像) の配列を転送する場合は、サポートされる最大ペイロード サイズ。

于 2016-08-22T18:06:17.600 に答える