質問編集履歴

2

説明文の変更

2021/08/26 07:03

投稿

Yutaka.engin
Yutaka.engin

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,8 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- Swiftでタブ機能付きTodoアプリを作成しており、現在ConfigurationIntent(?)でウィジェットの設定を作っています。
3
+ Swiftでタブ機能付きTodoアプリを作成しており、現在widgetkitのConfigurationIntent(?)でウィジェットの設定を作っています。
4
4
 
5
- ウィジェットの設定でタブを選択する事でそのタブのtodoを表示したいです。
5
+ ウィジェットの設定でタブを選択する事でそのタブ名と選択したタブのtodoを表示したいです。
6
6
 
7
7
 
8
8
 
@@ -10,9 +10,17 @@
10
10
 
11
11
 
12
12
 
13
+ こちらのサイトを参考に動的なウィジェットの作成をしています
13
14
 
15
+ [https://ichi.pro/widgetkit-kodona-kaihatsu-pa-to-2-183024227974601](https://ichi.pro/widgetkit-kodona-kaihatsu-pa-to-2-183024227974601)
14
16
 
15
- ### 試した事
17
+ ```
18
+
19
+ Thread 1: "-[__NSCFString index]: unrecognized selector sent to instance 0x6000037239e0"
20
+
21
+ ```
22
+
23
+ このようなエラーが出てきてウィジェットのビルドができないです。
16
24
 
17
25
 
18
26
 
@@ -20,11 +28,155 @@
20
28
 
21
29
 
22
30
 
31
+ ```Swift
23
32
 
33
+ class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessagesIntentHandling, INSetMessageAttributeIntentHandling, ConfigurationIntentHandling {
34
+
35
+ func provideTabNameOptionsCollection(for intent: ConfigurationIntent, with completion: @escaping (INObjectCollection<TabName>?, Error?) -> Void) {
36
+
37
+ var tabIndex = 0
38
+
39
+ var tabNames = [String]()
40
+
41
+ let userDefaults = UserDefaults(suiteName: "group.my_todo_ios")
42
+
43
+ if let storedTabName = userDefaults?.array(forKey: "tabName") as? [String] {
44
+
45
+ tabNames.append(contentsOf: storedTabName)
46
+
47
+ }
48
+
49
+ let allTabNames = tabNames.map {(tabName) -> TabName in
50
+
51
+ let allTabName = TabName(identifier: "(tabIndex)", display: tabName)
52
+
53
+ allTabName.index = tabIndex as NSNumber?
54
+
55
+ tabIndex += 1
56
+
57
+ return allTabName
58
+
59
+ }
60
+
61
+ let collection = INObjectCollection(items: allTabNames)
62
+
63
+ completion(collection, nil)
64
+
65
+ }
66
+
67
+ }
68
+
69
+ ```
70
+
71
+ ```Swift
72
+
73
+ struct Provider: IntentTimelineProvider {
74
+
75
+
76
+
77
+ typealias Intent = ConfigurationIntent
78
+
79
+
80
+
81
+ @available(iOSApplicationExtension 13.0, *)
82
+
83
+ func placeholder(in context: Context) -> SimpleEntry {
84
+
85
+ SimpleEntry(date: Date(), todoList: [], color: Color(.black), tabName:"")
86
+
87
+ }
88
+
89
+
90
+
91
+ @available(iOSApplicationExtension 13.0, *)
92
+
93
+ func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {
94
+
95
+ let entry = SimpleEntry(date: Date(), todoList: [], color: Color(.black), tabName:"")
96
+
97
+ completion(entry)
98
+
99
+ }
100
+
101
+
102
+
103
+ @available(iOSApplicationExtension 14.0, *)
104
+
105
+ func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
106
+
107
+ var entries: [SimpleEntry] = []
108
+
109
+ var todoList = [String]()
110
+
111
+ var color = UIColor()
112
+
113
+ let userDefaults = UserDefaults(suiteName: "group.my_todo_ios")
114
+
115
+ if userDefaults?.object(forKey: "SaveUIColor") == nil {
116
+
117
+ let SaveColor = try? NSKeyedArchiver.archivedData(withRootObject: UIColor.black, requiringSecureCoding: true)
118
+
119
+ userDefaults?.synchronize()
120
+
121
+ userDefaults?.set(SaveColor, forKey: "SaveUIColor")
122
+
123
+ }
124
+
125
+ if let SetColor = userDefaults?.object(forKey: "SaveUIColor") as? Data{
126
+
127
+ if let reloadColor = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(SetColor) as? UIColor{
128
+
129
+ color = reloadColor
130
+
131
+ }
132
+
133
+ }
134
+
135
+ if let storedTodoList = userDefaults?.array(forKey: "todoList(String(describing: configuration.tabName?.index))") as? [String] {
136
+
137
+ todoList.append(contentsOf: storedTodoList)
138
+
139
+ }
140
+
141
+ let entry = SimpleEntry( date: Date(), todoList: todoList, color: Color(color), tabName: configuration.tabName?.displayString ?? "")
142
+
143
+ entries.append(entry)
144
+
145
+ let timeline = Timeline(entries: entries, policy: .atEnd)
146
+
147
+ completion(timeline)
148
+
149
+ }
150
+
151
+ }
152
+
153
+
154
+
155
+ ```
24
156
 
25
157
 
26
158
 
27
159
  コードが足りなければ追記しますのでよろしくお願いいたします。
160
+
161
+
162
+
163
+ ### 試した事
164
+
165
+
166
+
167
+ ```
168
+
169
+ configuration.tabName?.index
170
+
171
+ configuration.tabName?.displayString ?? ""
172
+
173
+ ```
174
+
175
+ この2つを試しに静的に指定してあげると表示されます。
176
+
177
+ なのでここの呼び方、或いはconfigurationが悪いのだと思います。
178
+
179
+ どこが間違っているでしょうか?
28
180
 
29
181
 
30
182
 

1

説明文の修正

2021/08/26 07:03

投稿

Yutaka.engin
Yutaka.engin

スコア2

test CHANGED
File without changes
test CHANGED
@@ -8,11 +8,7 @@
8
8
 
9
9
  ### 発生している問題
10
10
 
11
- タブの選択自体はできたのですが選択したタブのtodoを表示できません。
12
11
 
13
- userDefaults?.array(forKey: "todoList(index)")のindexにユーザーが選択したタブのindexを代入できれば良いと思うのですが、何か方法はありますでしょうか?
14
-
15
- やろうとしている方法自体がダメならばどのようなアプローチがあるか教えていただきたいです。
16
12
 
17
13
 
18
14
 
@@ -24,87 +20,7 @@
24
20
 
25
21
 
26
22
 
27
- ```Swift
28
23
 
29
- class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessagesIntentHandling, INSetMessageAttributeIntentHandling, ConfigurationIntentHandling {
30
-
31
-
32
-
33
- func provideTabNameOptionsCollection(for intent: ConfigurationIntent, searchTerm: String?, with completion: @escaping (INObjectCollection<NSString>?, Error?) -> Void) {
34
-
35
- var tabName = [NSString]()
36
-
37
- let userDefaults = UserDefaults(suiteName: "group.my_todo_ios")
38
-
39
- if let storedTabName = userDefaults?.array(forKey: "tabName") as? [NSString] {
40
-
41
- tabName.append(contentsOf: storedTabName)
42
-
43
- }
44
-
45
- let allNameIdentifiers = INObjectCollection(items: tabName)
46
-
47
- print(allNameIdentifiers)
48
-
49
- completion(allNameIdentifiers, nil)
50
-
51
- }
52
-
53
- }
54
-
55
- ```
56
-
57
- ```Swift
58
-
59
- func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
60
-
61
- var entries: [SimpleEntry] = []
62
-
63
- var todoList = [String]()
64
-
65
- var color = UIColor()
66
-
67
- let index = 0
68
-
69
- let userDefaults = UserDefaults(suiteName: "group.my_todo_ios")
70
-
71
- if userDefaults?.object(forKey: "SaveUIColor") == nil {
72
-
73
- let SaveColor = try? NSKeyedArchiver.archivedData(withRootObject: UIColor.black, requiringSecureCoding: true)
74
-
75
- userDefaults?.synchronize()
76
-
77
- userDefaults?.set(SaveColor, forKey: "SaveUIColor")
78
-
79
- }
80
-
81
- if let SetColor = userDefaults?.object(forKey: "SaveUIColor") as? Data{
82
-
83
- if let reloadColor = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(SetColor) as? UIColor{
84
-
85
- color = reloadColor
86
-
87
- }
88
-
89
- }
90
-
91
- if let storedTodoList = userDefaults?.array(forKey: "todoList(index)") as? [String] {
92
-
93
- todoList.append(contentsOf: storedTodoList)
94
-
95
- }
96
-
97
- let entry = SimpleEntry( date: Date(), todoList: todoList, color: Color(color), tabName: configuration.tabName ?? "")
98
-
99
- entries.append(entry)
100
-
101
- let timeline = Timeline(entries: entries, policy: .atEnd)
102
-
103
- completion(timeline)
104
-
105
- }
106
-
107
- ```
108
24
 
109
25
 
110
26