swiftui

How do I Fix Swift Screen Time API Error: Value of type 'Button<Text>' has no member 'familyActivityPicker'


I have been following the tutorial from WWDC 21 for how to use the Screen Time API. The tutorial presents the following code:

import FamilyControls
import SwiftUI

@StateObject var model = MyModel()
@State var isPresented = false

var body: some View {
    Button("Select Apps to Discourage") {
        isPresented = true
    }
    .familyActivityPicker(isPresented: $isPresented, 
                          selection: $model.selectionToDiscourage)
}

I tried using this in my application as such:

import SwiftUI
import SwiftData
import FamilyControls

struct AppSelectionButton: View {
    @Binding var isPresented: Bool
    @ObservedObject var model: MyModel

    var body: some View {
        Button("Select Apps to Discourage") {
            isPresented = true
        }
        .familyActivityPicker(isPresented: $isPresented,
                              selection: $model.selectionToDiscourage)
    }
}

class MyModel: ObservableObject {
    @Published var selectionToDiscourage: FamilyActivitySelection

    init() {
        self.selectionToDiscourage = FamilyActivitySelection()
    }
}

But when I do so I get the error "Value of type 'Button' has no member 'familyActivityPicker'".

I also tried:

struct ExampleView: View {
    @@Published var selection = FamilyActivitySelection()

    var body: some View {
        VStack {
            Image(systemName: "eye")
                .font(.system(size: 76.0))
                .padding()

            FamilyActivityPicker(selection: $selection)

            Image(systemName: "hourglass")
                .font(.system(size: 76.0))
                .padding()
        }
        .onChange(of: selection) { newSelection in
            let applications = selection.applications
            let categories = selection.categories
            let webDomains = selection.webDomains
        }
    }
}

But it still didn't work.

I'm targetting iOS 18.1.

What could be causing this error?


Solution

  • Try this example code. See also FamilyActivityPicker

    class MyModel: ObservableObject {
        @Published var selectionToDiscourage = FamilyActivitySelection()
    }
    

    Here is my full test code:

    import FamilyControls
    import SwiftUI
    
    struct ContentView: View {
        @StateObject private var model = MyModel()
        @State private var isPresented = false
        
        var body: some View {
            Button("Select Apps to Discourage") {
                isPresented = true
            }
            .familyActivityPicker(isPresented: $isPresented,
                                  selection: $model.selectionToDiscourage)
            
         //   AppSelectionButton(isPresented: $isPresented, model: model)
        }
    }
    
    struct AppSelectionButton: View {
        @Binding var isPresented: Bool
        @ObservedObject var model: MyModel
        
        var body: some View {
            Button("Select Apps to Discourage") {
                isPresented = true
            }
            .familyActivityPicker(isPresented: $isPresented,
                                  selection: $model.selectionToDiscourage)
        }
    }
    
    class MyModel: ObservableObject {
        @Published var selectionToDiscourage = FamilyActivitySelection()
    }
    

    MacOS 15.3, using Xcode 16.2, target iOS-18, tested on real iOS device.