Отправить данные словаря в Apple Watch из приложения IOS
В моем приложении у меня есть эта страница с именем "TicketDetailViewController", в которой у меня есть 3 метки и изображение, в котором данные отображаются с предыдущей страницы. Теперь я хочу, чтобы, нажимая на кнопку "sendtowatch", я хочу отправить отображаемые данные, то есть 3 метки, и изображение в мои часы Apple, где я также взял 3 метки и изображение в его раскадровке. Проблема в том, что я использую базу данных 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)
}
}
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.
Есть много ответов на вопросы о том, как передать изображение на часы. Вы должны иметь в виду две вещи:
Размер изображения. Не тратьте время и батарею на передачу изображения с высоким разрешением, которое в конечном итоге будет отображаться на меньшем экране часов. Масштабируйте изображение перед его передачей.
Максимальный размер полезной нагрузки, который
sendMessage
поддерживает, особенно если вы собираетесь передавать массив билетов (и изображений), а не один билет.