質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

372閲覧

WatchConnectivityでUIcolorの配列を送る事は可能でしょうか?

Hayato1201

総合スコア220

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/09/26 13:56

編集2018/09/27 09:02

以下のサイトを参考にしてWatchConnectivityでwatchOSのアプリへ文字列の送信をすることが出来ました。
https://dev.classmethod.jp/smartphone/iphone/watchos3-bg-refresh-3/#complete

そのコードを以下に示します。(主に送受信の部分だけ)

Swift

1//iOS app側のVC 2WCSession.default.transferUserInfo(["titles_watch": List_watch]) //List_watchは文字列の配列

Swift

1//watchOS app側のIC 2 3func session(_ session: WCSession, 4 didReceiveUserInfo userInfo: [String : Any] = [:]) { 5 // データを取り出す 6 guard let titles_watch = userInfo["titles_watch"] as? [String] else { return } 7 8 // watchOS アプリにデータを反映する処理 9 DispatchQueue.main.async(execute: { () in 10 self.w_titles = titles_watch 11 }) 12 } 13

以上と同じ様に追加でUIcolorの配列も送受信したいです。

以下の様に行いました。

Swift

1//iOS app側のVC 2WCSession.default.transferUserInfo(["titles_watch": List_watch]) //List_watchは文字列の配列 3WCSession.default.transferUserInfo(["Colors_watch": Colors]) //ColorsはData型にエンコードしてあります

Swift

1//watchOS app側のIC 2 3func session(_ session: WCSession, 4 didReceiveUserInfo userInfo: [String : Any] = [:]) { 5 // データを取り出す 6 guard let titles_watch = userInfo["titles_watch"] as? [String] else { return } 7     guard let Colors_watch = userInfo["Colors_watch"] as? [UIColor] else { return }//userInfo["Colors_watch"]がnilでreturnしてしまう 8 9 // watchOS アプリにデータを反映する処理 10 DispatchQueue.main.async(execute: { () in 11 self.w_titles = titles_watch 12 }) 13 } 14

しかし以上のコメントに書いた様に受信した際にnilとなってしまいます。送信時には少なくともColorsに中身が入っている事は確認できるのですが、受信時にはなぜnilになってしまうのでしょうか?

-----追記ーーーーー
送信側で以下のように[UIColor]にデコードしてから送りました。

Swift

1//iOS app側のVC 2WCSession.default.transferUserInfo(["titles_watch": List_watch]) //List_watchは文字列の配列 3if let Colors_w = NSKeyedUnarchiver.unarchiveObject(with: Colors) as? [UIColor] { 4 5 WCSession.default.transferUserInfo(["Colors_watch": Colors_w]) //ここは実行されているので送信じはnilではないはずなのですが。。。 6 7 }

以上のようにして、やはり送信じはnilではない事を確認していますが、受診時に、userInfo["Colors_watch"]がnilでreturnしてしまいます。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2018/09/27 00:35 編集

(deleted)
guest

回答1

0

ベストアンサー

watchのことはよく知りませんが‥

Data型にしているのであれば、Data型から[UIColor]に戻さないといけないのでは?
そもそも、[UIColor]のままでは転送できないのでしょうか?

【追記】

よく見たら2回に分けて送信していたので、1回で送信してみては?

swift

1WCSession.default.transferUserInfo(["titles_watch": List_watch, "Colors_watch": Colors])

投稿2018/09/27 00:38

編集2018/09/28 02:32
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hayato1201

2018/09/27 00:46

回答ありがとうございます。 [UIColor]で行って最初同じ様にnilとなってしまっていたのでData型で送ってみました。なので[UIColor]でも出来ません。。。
fuzzball

2018/09/27 00:50

じゃあとりあえずDataを[UIColor]に戻しましょう。
Hayato1201

2018/09/27 09:04

追記させていただきました。 そもそも{UIcolor]をUserDefaultsに保存するためいったんData型にしていてそこから以上のようにデコードして送ろうとしてみましたがやはり受信時nilでretunしてしまいます。。。
fuzzball

2018/09/27 09:06

[UIColor]で送れないのは09:46のコメントで聞いていますが‥? デコードするのはwatch側ですよ。
Hayato1201

2018/09/27 14:30

すみません勘違いしました。Data型で送り、受信時は let Colors_watch = userInfo["Colors_watch"] as? Data if let c = NSKeyedUnarchiver.unarchiveObject(with: Colors_watch!) as? [UIColor] { print("DEBUG!!!!") } としました。するとUnexpectedly found nil while unwrapping an Optional valueとなってしまいます。要はやはりColors_watchがnilだからそもそもデコード出来ない様です。。。
fuzzball

2018/09/28 01:18

userInfo["Colors_watch"] が nil なのでしょうか? それとも as? Dataで失敗しているのでしょうか? print(userInfo)の出力はどうなってますか?
Hayato1201

2018/09/28 02:12

userInfo["Colors_watch"]がnilでした。print (userInfo["Colors_watch"])の結果がnilとなっている状態です。
Hayato1201

2018/09/28 02:17

ブレイクポイントを取ってみてみるとuserInfo = [String : Any] 1 key/value pairとなっているので、titles_watchの方のみuserInfoに入っている様です。
fuzzball

2018/09/28 02:17 編集

print(userInfo)の出力は? ※入れ違いになりました。了解です。
fuzzball

2018/09/28 02:19

もしかして didReceiveUserInfo って2回呼ばれてませんか?
Hayato1201

2018/09/28 02:20

print(userInfo)の方は、 ["titles_watch": <__NSArrayI 0x16ea5260>( titles_watchの中身 ) ] となっています。
Hayato1201

2018/09/28 02:23

func session(_ session: WCSession,didReceiveUserInfo userInfo: [String : Any] = [:]) {} このメソッドのことですよね?これは一度しか呼ばれていません。。。
fuzzball

2018/09/28 02:46 編集

もう何度も質問しているのですから、「userInfoにtitles_watchしか入っていない」辺りまでは自分で調べてから質問するようになって欲しいですね。 で、回答に追記してみました。試してみて下さい。
Hayato1201

2018/09/28 02:50

すみませんお手数をおかけいたしました。 以上で実行できました!ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問