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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:55:30