如何修复Screen Time API错误:Button无familyActivityPicker成员
iOS 18.1中Screen Time API报错原因及修复
报错核心原因
WWDC 21教程里的familyActivityPicker是iOS 15及更早版本的Screen Time API用法,iOS 16之后苹果彻底重构了这部分API,该Button修饰符被移除,所以在iOS 18.1项目中会触发“Value of type 'Button' has no member 'familyActivityPicker'”错误。
你尝试两种方式未解决的可能原因
- 自定义绑定选择器的问题:你沿用了旧API的绑定逻辑,但新API的
FamilyActivityPicker不再通过Button修饰符关联,旧的绑定方式完全不兼容新系统。 - 直接使用FamilyActivityPicker的问题:可能存在两个疏漏:
- 没有用
sheet/fullScreenCover这类容器视图来展示Picker,直接放置会导致Picker无法正常触发; - 缺少权限配置或权限请求,未获取Screen Time授权的情况下Picker无法工作。
- 没有用
修复方案
1. 改用新API的Picker展示方式
替换旧的Button修饰符写法,用弹窗形式调用FamilyActivityPicker:
import SwiftUI import ScreenTime struct ContentView: View { @State private var showActivityPicker = false @State private var activitySelection: FamilyActivitySelection? var body: some View { Button("选择应用/活动") { showActivityPicker = true } .sheet(isPresented: $showActivityPicker) { FamilyActivityPicker(selection: $activitySelection) { // 选择完成后的回调,比如关闭弹窗 showActivityPicker = false } } } }
2. 配置权限并请求授权
- 在
Info.plist中添加权限描述:
<key>NSFamilyActivityUsageDescription</key> <string>需要访问Screen Time数据以管理应用使用时长</string>
- 在App启动时请求Screen Time授权:
func requestScreenTimeAuth() { AuthorizationCenter.shared.requestAuthorization { status in switch status { case .authorized: // 授权成功,可正常使用Picker break case .denied, .restricted: // 授权失败,需提示用户开启权限 break @unknown default: break } } }
内容的提问来源于stack exchange,提问作者Ameen Izhac
相关产品推荐
相关产品推荐

