Mike Haslam
Mike Haslam

Reputation: 171

SwiftUI iOS 17 Xcode 15 change a button with an action to a NavigationLink or?

I have a view that is conditionally rendered on the state of a boolean.

It currently works but I am trying to clear this warning:

'init(destination:isActive:label:)' was deprecated in iOS 16.0: use NavigationLink(value:label:), or navigationDestination(isPresented:destination:), inside a NavigationStack or NavigationSplitView

So I am trying to navigate to a view when view wrapped in a button is pressed.


import SwiftUI

struct Question: View {
    @EnvironmentObject var invoiceViewModel: InvoiceViewModel
    @EnvironmentObject var settingsViewModel: SettingViewModel
    @State private var showingAlert = false
    
    var body: some View {
        NavigationStack{
            ZStack {
                // THIS WORK BUT IS DEPRECIATED
                NavigationLink(destination: BusinessDetails(), isActive: $invoiceViewModel.isShowBusinessDetaisLinkActive) {
                    EmptyView()
                }
                if invoiceViewModel.invoices().count == 0 {
                    // do stuff
                }else{
                    List{
                        // show created items
                    }
                    // THIS WORKS FOR OTHER VIEWS BUT NOT FOR BusinessDetails()
                    .navigationDestination(isPresented: $invoiceViewModel.isShowInvoiceDetaisLinkActive) {
                        InvoiceDetailView()
                    }
                }
                
                
                VStack{
                    //THIS IS WHERE CONDITIONAL RENDERING IS TOGGLING THE BOOL
                    // THAT FIRES THE NAVIGATION LINK WHERE I AM GETTING DEPRECAITION WARNING
                    if !settingsViewModel.checkBusinessDetailsComplete() {
                        Button(action: {
                            invoiceViewModel.isShowBusinessDetaisLinkActive.toggle()
                        }, label: {
                            
                            BusinessDetailsHeader()
                                .clipShape(RoundedRectangle(cornerRadius: 10))
                            
                        })
                        
                        .padding()
                    }
                    Spacer()
                }
                
            }
        .navigationDestination(isPresented: $invoiceViewModel.isShowAddNewInvoice) {
          AddNewInvoice()
       }
            .navigationTitle("Recent Invoices")
            .toolbar(content: {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button{
                        if !settingsViewModel.checkBusinessDetailsComplete() {
                            showingAlert = true
                        }else{
                            withAnimation{
                                invoiceViewModel.showAddNewInvoice()
                            }
                        }
                    } label: {
                        Label("Add", systemImage: "plus.circle")
                    }
                    
                    .alert("Complete Your Business Details", isPresented: $showingAlert) {
                        Button("Business Details") {
                            invoiceViewModel.isShowBusinessDetaisLinkActive.toggle()
                        }
                    }
                }
            })
            
        }
    }
}

#Preview {
    Question()
}

Upvotes: 0

Views: 304

Answers (1)

Mike Haslam
Mike Haslam

Reputation: 171

It was just where I was calling my multiple navigationDestination calls. Just had to call them all at end of NavigationStack

Upvotes: 0

Related Questions