如何在自定义SwiftUI ToolbarModifier中传入按钮点击函数?
解决方案
要实现不同页面给自定义Toolbar传入不同点击函数,只需给你的toolbarModifier添加一个闭包类型的属性,用来接收外部传入的点击事件逻辑,具体步骤如下:
1. 修改自定义Modifier结构体
给结构体添加一个**@escaping**的闭包属性(因闭包会在Button的action中延迟执行,需标记为逃逸闭包),然后在Button的action闭包里调用这个属性:
import Foundation import SwiftUI // 遵循Swift命名规范,结构体首字母大写 struct ToolbarModifier: ViewModifier { // 定义接收点击事件的闭包属性 let onButtonTap: () -> Void func body(content: Content) -> some View { content .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button { // 调用外部传入的点击函数 onButtonTap() } label: { Image(systemName: "checkmark.circle.fill") } } } } }
2. 给View添加拓展(可选但推荐)
为了让调用更简洁,可给View添加一个拓展方法,避免直接写.modifier(ToolbarModifier(...)):
extension View { func customToolbar(onButtonTap: @escaping () -> Void) -> some View { self.modifier(ToolbarModifier(onButtonTap: onButtonTap)) } }
3. 在不同页面中使用
在需要的页面里,直接传入当前页面的点击逻辑即可:
示例页面1:执行添加操作
struct AddItemView: View { var body: some View { NavigationStack { Text("添加页面") .customToolbar { // 传入当前页面的点击逻辑 addItem() } } } private func addItem() { print("执行添加操作") // 实际业务逻辑:比如添加数据到列表、弹窗提示等 } }
示例页面2:执行保存操作
struct SaveSettingsView: View { var body: some View { NavigationStack { Text("设置页面") .customToolbar { saveSettings() } } } private func saveSettings() { print("执行保存设置操作") // 实际业务逻辑:比如保存用户设置、更新数据库等 } }
如果不需要拓展方法,也可以直接使用.modifier调用:
Text("测试页面") .modifier(ToolbarModifier(onButtonTap: { print("直接传入匿名闭包逻辑") }))
内容的提问来源于stack exchange,提问作者mzkn
相关产品推荐
相关产品推荐

