私の質問がばかげている場合は申し訳ありませんが、私はプログラミングの初心者です。ビュー モデルの配列から生成されたリストから詳細ビューへのナビゲーション リンクがあります。詳細ビューで、タップした要素のプロパティの 1 つを変更できるようにしたいのですが、これを行う方法がわかりません。うまく説明できなかったと思うので、ここにコードを示します。
// model
struct Activity: Identifiable {
var id = UUID()
var name: String
var completeDescription: String
var completions: Int = 0
}
// view model
class ActivityViewModel: ObservableObject {
@Published var activities: [Activity] = []
}
// view
struct ActivityView: View {
@StateObject var viewModel = ActivityViewModel()
@State private var showingAddEditActivityView = false
var body: some View {
NavigationView {
VStack {
List {
ForEach(viewModel.activities, id: \.id) {
activity in
NavigationLink(destination: ActivityDetailView(activity: activity, viewModel: self.viewModel)) {
HStack {
VStack {
Text(activity.name)
Text(activity.miniDescription)
}
Text("\(activity.completions)")
}
}
}
}
}
.navigationBarItems(trailing: Button("Add new"){
self.showingAddEditActivityView.toggle()
})
.navigationTitle(Text("Activity List"))
}
.sheet(isPresented: $showingAddEditActivityView) {
AddEditActivityView(copyViewModel: self.viewModel)
}
}
}
// detail view
struct ActivityDetailView: View {
@State var activity: Activity
@ObservedObject var viewModel: ActivityViewModel
var body: some View {
VStack {
Text("Number of times completed: \(activity.completions)")
Button("Increment completion count"){
activity.completions += 1
updateCompletionCount()
}
Text("\(activity.completeDescription)")
}
}
func updateCompletionCount() {
var tempActivity = viewModel.activities.first{ activity in activity.id == self.activity.id
}!
tempActivity.completions += 1
}
}
// Add new activity view (doesn't have anything to do with question)
struct AddEditActivityView: View {
@ObservedObject var copyViewModel : ActivityViewModel
@State private var activityName: String = ""
@State private var description: String = ""
var body: some View {
VStack {
TextField("Enter an activity", text: $activityName)
TextField("Enter an activity description", text: $description)
Button("Save"){
// I want this to be outside of my view
saveActivity()
}
}
}
func saveActivity() {
copyViewModel.activities.append(Activity(name: self.activityName, completeDescription: self.description))
print(copyViewModel.activities)
}
}
詳細ビューでは、その特定のアクティビティの完了カウントを更新しようとしており、ビュー モデルを更新しています。上記で試した方法はおそらく意味がなく、明らかに機能しません。私は試したことを示すためにそれを残しました。
助けや洞察をありがとう。