Swift 5开发待办App动态添加列表按钮的实现方案咨询
实现方案
你需要的效果可以通过动态数据+导航绑定的逻辑实现,核心思路是先定义待办列表的数据模型,用数组存储所有已创建的列表,导航逻辑和数组元素绑定,新增列表时同时更新数组和导航选中状态即可。
第一步:定义数据模型
import SwiftUI // 待办列表数据模型 struct TodoList: Identifiable { let id = UUID() var name: String = "新列表" var todoItems: [String] = [] }
第二步:实现主页逻辑(兼容iOS16+,推荐)
用官方推荐的NavigationStack实现,代码如下:
struct ContentView: View { // 存储所有已创建的待办列表 @State private var allLists: [TodoList] = [] // 绑定当前选中的待办列表ID,控制跳转 @State private var selectedListId: TodoList.ID? var body: some View { NavigationStack(path: $selectedListId) { VStack(spacing: 20) { // 顶部Logo区域,自行替换为你的logo图片 Image("your-logo-name") .resizable() .scaledToFit() .frame(height: 80) // 新建列表按钮 Button("新建列表") { // 1. 新增一个空白列表到数组 let newList = TodoList() allLists.append(newList) // 2. 绑定选中ID,自动跳转到新列表页 selectedListId = newList.id } .buttonStyle(.borderedProminent) // 已创建的列表入口区域 List(allLists) { list in NavigationLink(list.name, value: list.id) } .listStyle(.plain) } .navigationTitle("Nudge") // 导航目的地绑定,根据选中的列表ID加载对应详情页 .navigationDestination(for: TodoList.ID.self) { id in if let index = allLists.firstIndex(where: { $0.id == id }) { TodoListDetailView(list: $allLists[index]) } } } } } // 列表详情页,支持修改名称、添加待办内容 struct TodoListDetailView: View { @Binding var list: TodoList @State private var newItemText = "" var body: some View { Form { Section("列表名称") { TextField("输入列表名称", text: $list.name) } Section("待办内容") { ForEach(list.todoItems, id: \.self) { item in Text(item) } HStack { TextField("新增待办", text: $newItemText) Button("添加") { guard !newItemText.isEmpty else { return } list.todoItems.append(newItemText) newItemText = "" } } } } .navigationTitle(list.name) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
代码说明
- 所有已创建的列表入口通过遍历
allLists数组生成,新增列表时数组自动更新,主页就会多出对应的跳转按钮 - 导航逻辑和列表ID绑定,不需要手动控制
isShowing类的布尔状态,新增列表后直接赋值selectedListId即可自动跳转 - 详情页通过
@Binding和原数组数据绑定,修改名称、添加待办内容都会同步更新到主页的列表入口 - 如果需要兼容iOS15及更早版本,把
NavigationStack替换为NavigationView,用NavigationLink(tag:selection:)的语法绑定列表ID即可,核心逻辑完全一致
需求示意图

内容的提问来源于stack exchange,提问作者Henry McCreight
相关产品推荐
相关产品推荐

