列出 SwiftUI 上的交互问题

问题描述 投票:0回答:1

我正在尝试使用 Swift for VisionOS 创建一个简单的待办事项列表应用程序。到目前为止,当用户创建第一个待办事项列表时,用户可以为其命名、选择并将待办事项添加到列表中。但是,当用户尝试创建更多待办事项列表时,无法选择它们。

import SwiftUI

struct ContentView: View {
    @State private var TodoLists: [TodoList] = []
    @State private var selectedTodoList: TodoList? = nil
    @State private var showAddListAlert: Bool = false
    @State private var newListTitle: String = ""
    @State private var nextListID: Int = 0
    
    var body: some View {
        NavigationSplitView {
            List(TodoLists) { list in
                Button(list.title) {
                    selectedTodoList = list
                }
            }
            .navigationTitle("Todo lists")
            .toolbar {
                Button("Add") {
                    showAddListAlert.toggle()
                }
            }
            .alert("Add Todo List", isPresented: $showAddListAlert) {
                TextField("Todo List Title", text: $newListTitle)
                Button("Cancel", role: .cancel, action: {})
                Button("Create") {
                    let list = TodoList(title: newListTitle.isEmpty ? "List \(nextListID)" : newListTitle, items: [], id: UUID())
                    TodoLists.append(list)
                    nextListID += 1
                }
            }
        } detail: {
            if let selectedTodoList {
                TodoListView(list: selectedTodoList)
            }
        }
    }
}

我本以为 Button(list.title) { selectedTodoList = list } 会设置选定的选定列表。也许子视图(TodoListView)正在干扰:

import SwiftUI

struct TodoListView: View {
    @State var list: TodoList
    @State private var showAddTodoAlert: Bool = false
    @State private var newTodoTitle: String = ""
    
    var body: some View {
        List(list.items) { item in
            Text(item.title)
        }
        .navigationTitle("Details for \(list.title)")
        .toolbar {
          Button("Add Todo") {
            showAddTodoAlert.toggle()
          }
        }
        .alert("Add Todo", isPresented: $showAddTodoAlert) {
            TextField("Todo Title", text: $newTodoTitle)
            Button("Cancel", role: .cancel, action: {})
            Button("Create") {
                let todo = TodoItem(title: newTodoTitle, isDone: false)
                list.items.append(todo)
            }
        }
        .id(list.id)
    }
    
    
}
swift user-interface swiftui window visionos
1个回答
0
投票

在 ContentView 的详细视图中写入 .id(selectedTodoList.id) 解决了该问题。显然,这是一个 SwiftUI 错误导致了问题。

© www.soinside.com 2019 - 2024. All rights reserved.