前提・実現したいこと
Swiftでタブ機能付きTodoアプリを作成しており、現在widgetkitのConfigurationIntent(?)でウィジェットの設定を作っています。
ウィジェットの設定でタブを選択する事でそのタブ名と選択したタブのtodoを表示したいです。
発生している問題
こちらのサイトを参考に動的なウィジェットの作成をしています
https://ichi.pro/widgetkit-kodona-kaihatsu-pa-to-2-183024227974601
Thread 1: "-[__NSCFString index]: unrecognized selector sent to instance 0x6000037239e0"
このようなエラーが出てきてウィジェットのビルドができないです。
該当のソースコード
Swift
1class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessagesIntentHandling, INSetMessageAttributeIntentHandling, ConfigurationIntentHandling { 2 func provideTabNameOptionsCollection(for intent: ConfigurationIntent, with completion: @escaping (INObjectCollection<TabName>?, Error?) -> Void) { 3 var tabIndex = 0 4 var tabNames = [String]() 5 let userDefaults = UserDefaults(suiteName: "group.my_todo_ios") 6 if let storedTabName = userDefaults?.array(forKey: "tabName") as? [String] { 7 tabNames.append(contentsOf: storedTabName) 8 } 9 let allTabNames = tabNames.map {(tabName) -> TabName in 10 let allTabName = TabName(identifier: "(tabIndex)", display: tabName) 11 allTabName.index = tabIndex as NSNumber? 12 tabIndex += 1 13 return allTabName 14 } 15 let collection = INObjectCollection(items: allTabNames) 16 completion(collection, nil) 17 } 18}
Swift
1struct Provider: IntentTimelineProvider { 2 3 typealias Intent = ConfigurationIntent 4 5 @available(iOSApplicationExtension 13.0, *) 6 func placeholder(in context: Context) -> SimpleEntry { 7 SimpleEntry(date: Date(), todoList: [], color: Color(.black), tabName:"") 8 } 9 10 @available(iOSApplicationExtension 13.0, *) 11 func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { 12 let entry = SimpleEntry(date: Date(), todoList: [], color: Color(.black), tabName:"") 13 completion(entry) 14 } 15 16 @available(iOSApplicationExtension 14.0, *) 17 func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) { 18 var entries: [SimpleEntry] = [] 19 var todoList = [String]() 20 var color = UIColor() 21 let userDefaults = UserDefaults(suiteName: "group.my_todo_ios") 22 if userDefaults?.object(forKey: "SaveUIColor") == nil { 23 let SaveColor = try? NSKeyedArchiver.archivedData(withRootObject: UIColor.black, requiringSecureCoding: true) 24 userDefaults?.synchronize() 25 userDefaults?.set(SaveColor, forKey: "SaveUIColor") 26 } 27 if let SetColor = userDefaults?.object(forKey: "SaveUIColor") as? Data{ 28 if let reloadColor = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(SetColor) as? UIColor{ 29 color = reloadColor 30 } 31 } 32 if let storedTodoList = userDefaults?.array(forKey: "todoList(String(describing: configuration.tabName?.index))") as? [String] { 33 todoList.append(contentsOf: storedTodoList) 34 } 35 let entry = SimpleEntry( date: Date(), todoList: todoList, color: Color(color), tabName: configuration.tabName?.displayString ?? "") 36 entries.append(entry) 37 let timeline = Timeline(entries: entries, policy: .atEnd) 38 completion(timeline) 39 } 40} 41
コードが足りなければ追記しますのでよろしくお願いいたします。
試した事
configuration.tabName?.index configuration.tabName?.displayString ?? ""
この2つを試しに静的に指定してあげると表示されます。
なのでここの呼び方、或いはconfigurationが悪いのだと思います。
どこが間違っているでしょうか?
補足情報(FW/ツールのバージョンなど)
Xcode 12.5.1
Swift 5.4.2
widgetkit
あなたの回答
tips
プレビュー