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

SwiftUI使用.searchable时如何监听取消按钮点击并执行自定义操作

方案1:纯SwiftUI实现(无需桥接UIKit)

系统点击searchable的取消按钮时,会触发两个固定行为:清空搜索文本、将isSearching环境变量从true置为false。你可以通过监听这两个状态的变化,区分用户手动清空文本和点击取消的场景,触发自定义操作:

import SwiftUI

struct SearchView: View {
    @State private var searchText = ""
    @Environment(\.isSearching) private var isSearching
    @State private var lastIsSearching = false

    var body: some View {
        NavigationStack {
            List {
                // 你的列表内容
            }
            .searchable(text: $searchText)
            .onChange(of: isSearching) { newState in
                // 仅当从搜索状态退出、且搜索文本为空时,判定为点击取消按钮
                if lastIsSearching && !newState && searchText.isEmpty {
                    customCancelAction()
                }
                lastIsSearching = newState
            }
        }
    }

    func customCancelAction() {
        // 此处执行你需要的自定义逻辑
        print("取消按钮被点击")
    }
}

方案2:桥接UIKit实现精准监听

如果你需要完全精准的取消按钮点击回调,不依赖系统行为判断,可以直接桥接UIKit的UISearchBar,使用原生的searchBarCancelButtonClicked代理方法:

// 自定义桥接搜索栏
struct CustomSearchBar: UIViewRepresentable {
    @Binding var text: String
    var onCancel: () -> Void

    func makeUIView(context: Context) -> UISearchBar {
        let bar = UISearchBar()
        bar.delegate = context.coordinator
        bar.showsCancelButton = true
        return bar
    }

    func updateUIView(_ uiView: UISearchBar, context: Context) {
        uiView.text = text
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(text: $text, onCancel: onCancel)
    }

    class Coordinator: NSObject, UISearchBarDelegate {
        @Binding var text: String
        var onCancel: () -> Void

        init(text: Binding<String>, onCancel: @escaping () -> Void) {
            _text = text
            self.onCancel = onCancel
        }

        func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
            text = searchText
        }

        func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
            text = ""
            searchBar.endEditing(true)
            onCancel()
        }
    }
}

// 调用示例
struct ContentView: View {
    @State private var searchText = ""

    var body: some View {
        NavigationStack {
            VStack {
                CustomSearchBar(text: $searchText, onCancel: {
                    // 自定义取消逻辑
                    print("取消按钮被点击")
                })
                List {
                    // 你的列表内容
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:06:02