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

SwiftUI Toolbar Button无法跳转视图,寻求可行实现方案

问题原因及解决方法

你的Toolbar按钮无响应,是因为把Button嵌套在NavigationLink里,点击事件被Button拦截,导致NavigationLink无法触发导航。下面是几种可行的实现方式:


方式一:直接使用NavigationLink作为Toolbar内容

移除多余的Button,让NavigationLink直接包裹Label,这是最简洁的写法:

var body: some View {
    NavigationView {
        List {
            ForEach(items) { item in
                NavigationLink {
                    DisplayContactView()
                } label: {
                    Text(item.timestamp!, formatter: itemFormatter)
                }
            }
            .onDelete(perform: deleteItems)
        }
        .navigationTitle("Contacts")
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                EditButton()
                    .foregroundColor(.black)
            }
            ToolbarItem {
                NavigationLink {
                    AddContactView()
                } label: {
                    Label("Add Contact", systemImage: "plus")
                        .foregroundColor(.black)
                }
            }
        }
        Text("Select a Contact")
    }
}

方式二:用状态变量控制导航(iOS 16+ 推荐)

使用navigationDestinationAPI,通过状态变量触发导航,这种方式更灵活,方便后续扩展逻辑:

  1. 先在View中添加状态变量:
@State private var isPresentingAddView = false
  1. 修改Toolbar和导航绑定:
var body: some View {
    NavigationView {
        List {
            ForEach(items) { item in
                NavigationLink {
                    DisplayContactView()
                } label: {
                    Text(item.timestamp!, formatter: itemFormatter)
                }
            }
            .onDelete(perform: deleteItems)
        }
        .navigationTitle("Contacts")
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                EditButton()
                    .foregroundColor(.black)
            }
            ToolbarItem {
                Button {
                    isPresentingAddView = true
                } label: {
                    Label("Add Contact", systemImage: "plus")
                        .foregroundColor(.black)
                }
            }
        }
        .navigationDestination(isPresented: $isPresentingAddView) {
            AddContactView()
        }
        Text("Select a Contact")
    }
}

方式三:兼容iOS 15及以下版本

如果需要适配iOS 15,可以通过绑定isActive的隐藏NavigationLink实现:

  1. 添加状态变量:
@State private var isPresentingAddView = false
  1. 在NavigationView内添加隐藏的NavigationLink,并修改Toolbar按钮:
var body: some View {
    NavigationView {
        // 隐藏的NavigationLink,用于触发导航
        NavigationLink(
            "",
            destination: AddContactView(),
            isActive: $isPresentingAddView
        )
        .hidden()
        
        List {
            ForEach(items) { item in
                NavigationLink {
                    DisplayContactView()
                } label: {
                    Text(item.timestamp!, formatter: itemFormatter)
                }
            }
            .onDelete(perform: deleteItems)
        }
        .navigationTitle("Contacts")
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                EditButton()
                    .foregroundColor(.black)
            }
            ToolbarItem {
                Button {
                    isPresentingAddView = true
                } label: {
                    Label("Add Contact", systemImage: "plus")
                        .foregroundColor(.black)
                }
            }
        }
        Text("Select a Contact")
    }
}

内容的提问来源于stack exchange,提问作者vrao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:35