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

如何在自定义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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 17:42:05