You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:45:04