iosswiftswiftuiviewcontrollerswiftui-navigationview

SwiftUI's navigationBarItems leading and trailing buttons not showing in FamilyActivityPicker


I have the following View in SwiftUI to display FamilyActivityPicker:

import SwiftUI
import FamilyControls

struct FamilyActivityPickerView: View {
    @State private var selectionToDiscourage = FamilyActivitySelection()
    @Environment(\.dismiss) private var dismiss
    
    var body: some View {
        FamilyActivityPicker(headerText: "Select Apps to Restrict", selection: $selectionToDiscourage).navigationBarItems(leading: Button("Cancel") {
            print("Cancel!")
            dismiss()
        }, trailing: Button("Done") {
            print("Done!")
            dismiss()
        }).ignoresSafeArea().onChange(of: selectionToDiscourage) { newSelection in
            let applications = selectionToDiscourage.applications
            let categories = selectionToDiscourage.categories
            let webDomains = selectionToDiscourage.webDomains
            print("applications: \(applications), categories: \(categories), webDomains: \(webDomains)")
        }
    }
}

However, neither of the navigationBarItems leading and trailing buttons are showing:

enter image description here

What am I doing wrong? How are we supposed to Cancel or Done the FamilyActivityPicker view?

EDIT:

When I use NavigationStack with .toolbar, I end up with 2 navigation bars as shown below screenshot which looks very ugly and wastes space:

import SwiftUI
import FamilyControls

struct FamilyActivityPickerView: View {
    @State private var selectionToDiscourage = FamilyActivitySelection()
    @Environment(\.dismiss) private var dismiss
    
    var body: some View {
        NavigationStack {
            FamilyActivityPicker(selection: $selectionToDiscourage).ignoresSafeArea().onChange(of: selectionToDiscourage) { newSelection in
                let applications = selectionToDiscourage.applications
                let categories = selectionToDiscourage.categories
                let webDomains = selectionToDiscourage.webDomains
                print("applications: \(applications), categories: \(categories), webDomains: \(webDomains)")
            }.toolbar {
                ToolbarItem(placement: .navigationBarLeading) {
                    Button("Cancel") {
                        print("Cancel!")
                        dismiss()
                    }
                }
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("Done") {
                        print("Done!")
                        dismiss()
                    }
                }
            }
        }
    }
}

Result:

enter image description here


Solution

  • What you are looking for is `familyActivityPicker` not `FamilyActivityPicker`

        import SwiftUI
        import FamilyControls
    
        struct FamilyParentView: View {
            @State var selection = FamilyActivitySelection()
            @State var isPresented = false
    
    
           var body: some View {
               Button("Present FamilyActivityPicker") { isPresented = true }
               .familyActivityPicker(isPresented: $isPresented,
                                     selection: $selection)
               .onChange(of: selection) { _, newSelection in
                   let applications = selection.applications
                   let categories = selection.categories
                   let webDomains = selection.webDomains
               }
           }
        }