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,通过状态变量触发导航,这种方式更灵活,方便后续扩展逻辑:
- 先在View中添加状态变量:
@State private var isPresentingAddView = false
- 修改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实现:
- 添加状态变量:
@State private var isPresentingAddView = false
- 在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
相关产品推荐
相关产品推荐

