Как использовать NavigationLink для определения имени элемента Click NavigationView - PullRequest
0 голосов
/ 30 мая 2020

Как можно изменить назначение NavigationLink, чтобы определить, какой элемент в списке был выбран? Какая-нибудь инструкция if была бы очень полезна, но все элементы в настоящее время делают то же самое.

import SwiftUI

let textTitle = NSLocalizedString("PageTitle", comment: "")
let textItemA = NSLocalizedString("ItemA", comment: "")
let textItemB = NSLocalizedString("ItemB", comment: "")
let textItemC = NSLocalizedString("ItemC", comment: "")

struct ItemMain: Identifiable {
    var id = UUID()
    var name: String
}

let myItems: [MyItem] = [
    MyItem(name: textItemA),
    MyItem(name: textItemB),
    MyItem(name: textItemC)]

struct ContentView: View {
    @State private var showingAlert = false

    var body: some View {
        NavigationView{
            List(myItems) { myItem in
                NavigationLink(destination: MyDetailView(myItem: myItem)) {
                    Text(myItem.name)
                }
            }

            .navigationBarTitle(textTitle)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

struct MyDetailView: View {
    var myItem: MyItem

    var body: some View {
        Text(myIem.name)
    }
}

Ответы [ 2 ]

1 голос
/ 30 мая 2020
I customized your MyItem model as it is not provided by you

        enum MyItemType {
        case navigation
        case alert
    }

    struct MyItem: Identifiable {
        let id = UUID()
        let name: String
        var type: MyItemType = .alert
    }

And made changed to your ContentView

   struct ContentView: View {
    @State private var showingAlert = false

    var body: some View {
        NavigationView{
            listView
                .navigationBarTitle(textTitle)
        }
        .alert(isPresented: $showingAlert) {
            //Customise your alert according to your need
            Alert(title: Text("Alert"))
        }
    }

    private var listView: some View {
        List(myItems) { myItem in
            if myItem.type == .navigation {
                NavigationLink(destination: MyDetailView(myItem: myItem)) {
                    Text(myItem.name)
                }
            } else {
                Button(action: {
                    self.showingAlert = true
                }) {
                    Text(myItem.name)
                }
            }
        }
    }
}

And lastly your `myItems` array:

    let myItems: [MyItem] = [
    MyItem(name: textItemA, type: MyItemType.navigation),
    MyItem(name: textItemB),
    MyItem(name: textItemC)]
0 голосов
/ 30 мая 2020

Вы можете использовать оператор if внутри ForEach, чтобы указать особые случаи:

List(myItems) { myItem in
    if (myItem.name == "ItemA") //<<< Here goes your if 
    {
        NavigationLink(destination: MyDetailView(myItem: myItem)) {
            Text(myItem.name)
        }
     }
     else 
     {
         //show your alert here
...