Swift中如何在授权成功后隐藏请求权限按钮?
问题分析与解决
你遇到的错误是因为print("All set!")的返回值是Void(空元组()),这个类型没有isHidden属性,直接在它后面加.isHidden完全不符合语法逻辑。要实现授权后隐藏按钮,需要用状态变量来控制按钮的显示状态。
修正后的代码
import SwiftUI import UserNotifications struct ContentView: View { // 定义状态变量,控制按钮是否隐藏 @State private var isPermissionGranted = false var body: some View { VStack { Button("Request Permission") { UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] success, error in // 授权回调在后台线程,必须切换到主线程更新UI DispatchQueue.main.async { if success { print("All set!") // 更新状态变量,触发按钮隐藏 self?.isPermissionGranted = true } else if let error = error { print(error.localizedDescription) } } } } // 绑定状态变量到按钮的isHidden属性 .isHidden(isPermissionGranted) } } }
关键说明
- 用
@State声明isPermissionGranted变量,它会自动触发视图的更新 - 授权回调是在后台队列执行的,必须通过
DispatchQueue.main.async回到主线程修改UI相关状态,否则会引发线程错误 - 闭包中使用
[weak self]避免持有self造成循环引用
内容的提问来源于stack exchange,提问作者Aoi
相关产品推荐
相关产品推荐

