能否为SwiftUI的popoverTip添加关闭回调处理?
解决PopoverTip关闭时执行代码的问题
你尝试的.onDisappear之所以无效,是因为它绑定的是父视图(此处的Text)的消失事件,而非PopoverTip本身的关闭事件。要实现Tip关闭时执行代码,可以通过监听Tip的展示状态变化来实现,以下是可行方案:
方案:监听Tip的isDisplayed状态
- 先创建Tip的实例,而非直接在
popoverTip中初始化,这样才能获取并监听它的状态。 - 使用
.onChange监听Tip的isDisplayed属性,当状态从true(显示)变为false(关闭)时,执行目标代码。 - 别忘了通过
TipManager配置Tip,确保Tip能正常加载显示。
修改后的完整代码:
import SwiftUI import TipKit struct MRETip: Tip { let title = Text("This is a tip") } struct MREView: View { // 创建Tip实例,用于后续监听状态 private let tip = MRETip() var body: some View { Text("Hello, World!") .popoverTip(tip) // 监听Tip展示状态变化 .onChange(of: tip.isDisplayed) { oldValue, newValue in if oldValue == true && newValue == false { print("tip dismissed") // 在这里添加你需要执行的代码 } } // 配置TipManager,加载Tip数据 .task { try? await TipManager.shared.configure([tip]) } } } #Preview { MREView() }
备选方案:监听全局展示的Tip集合
也可以通过监听TipManager.shared.displayedTips的变化,判断目标Tip是否从展示列表中移除:
.onChange(of: TipManager.shared.displayedTips) { currentDisplayedTips in if !currentDisplayedTips.contains(where: { $0.id == tip.id }) { print("tip dismissed") } }
内容的提问来源于stack exchange,提问作者Peter Warbo
相关产品推荐
相关产品推荐

