You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SwiftUI中带.cancel角色的确认对话框按钮不显示且报IOSurfaceClientSetSurfaceNotify failed错误的问题咨询

SwiftUI中带.cancel角色的确认对话框按钮不显示且报IOSurfaceClientSetSurfaceNotify failed错误的问题咨询

嘿,这个问题我之前帮朋友排查过,挺有代表性的,咱们一步步来捋清楚:

为什么带.cancel角色的"No"按钮不显示?

这其实是SwiftUI confirmationDialog组件的特殊设计(或者说早期版本的小bug):

  • 当你给按钮指定.cancel角色时,系统会默认接管取消操作的展示逻辑——在多数iOS版本里,系统会自动在对话框角落显示一个默认的「取消」按钮(用系统语言的默认文本),你自定义的带.cancel角色的"No"按钮会被系统默认按钮覆盖,导致肉眼看不到。
  • 另外在iOS 15到iOS 16早期版本中,当对话框同时存在.destructive角色按钮和自定义.cancel角色按钮时,SwiftUI的布局逻辑会出现冲突,直接隐藏掉你自定义的cancel按钮。

对应的修复方案

给你两个实用的解决思路,按需选择:

  1. 自定义取消按钮文本,放弃.cancel角色
    如果就想显示"No"作为取消按钮,直接去掉.cancel角色参数就行,代码修改后是这样:

    Button("No") {}
    

    这样系统不会干预这个按钮的显示,而且对话框点击空白处关闭的默认行为依然生效,完全不影响使用体验。

  2. 遵循系统规范,使用默认取消按钮
    如果你想贴合系统设计语言,用默认的取消文本(比如中文环境下的「取消」),可以不用自己写cancel按钮,让系统自动生成,代码调整后如下:

    .confirmationDialog(
        Text("Are you sure?"),
        isPresented: $isConfirmShown,
        titleVisibility: .visible
    ) {
        Button("Yes", role: .destructive) {}
    }
    message: {
        Text("Some message, ...")
    }
    

    这时候系统会自动在对话框里添加默认的取消按钮,完全符合苹果的设计规范。

关于IOSurfaceClientSetSurfaceNotify failed e00002c7错误

这个日志真的不用太在意!它是系统底层的小噪音,和你的按钮不显示问题没有直接关联,大多出现在模拟器或者旧版本iOS设备上。你试试重启Xcode、模拟器/真机,这个错误日志基本就消失了,完全不会影响App的功能和上架。

如果你的测试设备用的是iOS 15.x这类旧版本,升级到iOS 16.4以上的版本,不仅这个日志大概率会消失,SwiftUI对话框的很多小bug也会被官方修复哦~

火山引擎 最新活动