Параметр просмотра NavigationLink SwiftUI

#swiftui #swiftui-navigationlink

#swiftui #swiftui-navigationlink

Вопрос:

Когда я вызываю NavigationImageView в моем представлении, я хочу отправлять разные представления при каждом вызове, чтобы я мог перемещаться по разным представлениям.Но проблема в том, как я могу отправить параметр просмотра в NavigationLink. Я пробовал View и UIView, но это выдает ошибку.

 struct NavigationImageView: View {
    
    var item : Store
    var destinationView: View
    
    var body: some View {
        
        NavigationLink(destination:destinationView ) {
            
            Image(uiImage: (item.banner?.url)!.load())
                .resizable()
                .aspectRatio(CGFloat((item.banner?.ratio)!), contentMode: .fit)
                .cornerRadius(12)
                .shadow(radius: 4)
                .frame(width: CGFloat(UIScreen.main.bounds.width * 0.9), height: CGFloat((UIScreen.main.bounds.width / CGFloat((item.banner?.ratio) ?? 1))))
            
        }
    }
}
 

Ответ №1:

Здесь необходимо использовать общие параметры, поскольку тип целевого представления заранее неизвестен:

 struct NavigationImageView<DestinationType: View>: View {
    
    var item : Store
    var destinationView: DestinationType

    // ... other code
}
 

Ответ №2:

Взгляните на следующий пример…

Ваше свойство должно быть any View , и тогда вы можете назначить ему любое представление, которое вы будете использовать в качестве пункта назначения.

 import SwiftUI

struct ContentView: View {
    
    @State var showViewTwo : Bool = false
    
    //computed property of type some View which returns different views depending on a condition
    var destination : some View { 
        if showViewTwo {
            return Text("Hello Second View")
        }
        else
        {
            return Text("Hello First View")
        }
    }
    
    var body: some View {
        
        NavigationView {
           NavigationLink("Press me", destination: destination)
        }
        
        Button(action: {
            showViewTwo.toggle()
        }) {
            Text("Toggle View")
        }
        
    }
}