web-dev-qa-db-ja.com

ObservableObject: 'subscript(_ :)'の配列の要素をバインドすることは非推奨です

オブジェクト( 'exampleObject')の配列( 'exampleList')を含むObservableObject 'DataStore'を使用しています。

@Published exampleList = [exampleObject]()

@EnvironmentObject( 'dataStore')を介してDataStoreを呼び出しています。

@EnvironmentObject var dataStore = DataStore()

それから私はリストを反復します

ForEach(0..<dataStore.exampleList.count) { index in ....

Itemの要素を詳細ビューにバインドするには、次のようにします。

DetailView(itemBinding: $dataStore.exampleList[index])

Xcode11ベータ4までは、完全に機能していました。

XCode11ベータ5以来、それはまだ機能しますが、Xcodeは私にこの警告を与えます:

'subscript(_ :)'は廃止されました:移行パスについてはリリースノートを参照してください

文字列の配列を含む単純な@State変数を使用して、より単純なもので試しましたが、それは同じ問題です:この配列の要素を呼び出して、その値をTextFieldに使用しようとすると、

TextField("test", text: $test[0])

同じ警告が表示されます。

修正方法がわかりません。これは、配列内の値をバインドできなくなったことを意味しますか?次に、配列を反復処理して特定のアイテムをバインドする方法を教えてください。

これはStackoverflowに関する私の最初の質問です。私の質問が不器用である場合は謝罪します...あなたの回答に感謝します。私は何年もStackoverflowを使用しています。すばらしく、いつも既存の役立つ回答を見つけますが、初めてです。何も見つかりません。それが私が尋ねている理由です。

13
hasselfred

最近、監視可能なオブジェクトの配列をバインドする必要があり、安定したXCode11で警告を受けませんでした。こうやって

struct ScheduleTimer: Identifiable {
    var id: Int
    var name: String
    var start: Date
    var end: Date
    var isActive: Bool
}

struct ScheduleView: View {
    @ObservedObject var scheduleController = ScheduleController()
    var body: some View {
        NavigationView {
            Form {
                ForEach(scheduleController.timers) { timer in
                    ScheduleForm(scheduleController: self.scheduleController, timer: timer)
                }
            }
        }
    }
}


struct ScheduleForm: View {
    @ObservedObject var scheduleController: ScheduleController
    var timer: ScheduleTimer
    var scheduleIndex: Int {
        scheduleController.timers.firstIndex(where: { $0.id == timer.id })!
    }
    @State var start = Date()
    var body: some View {
        Section(header: Text(self.scheduleController.timers[scheduleIndex].name)){
            DatePicker("From", selection: self.$scheduleController.timers[scheduleIndex].start, displayedComponents: .hourAndMinute)
            DatePicker("To", selection: self.$scheduleController.timers[scheduleIndex].end, displayedComponents: .hourAndMinute)
            Toggle(isOn: self.$scheduleController.timers[scheduleIndex].isActive) {
                Text("")
            }.toggleStyle(DefaultToggleStyle())
        }
    }
}

class ScheduleController: ObservableObject {
    @Published var timers = [ScheduleTimer]()
...
0
Watermamal