1

のときに がアクティブになるSwiftUIのを防ぐことはできません。この単純なコードでは、詳細ページを表示するかどうかを決定する前に、何らかのビジネス チェックを行う必要があります (実際のアプリでは、ボタンのアクション内で何らかのビジネス ロジックが発生する可能性があります):NavigationLinkList

struct ContentView: View {
    @State var showDetail = false
    var body: some View {
        NavigationView {
            List {
                Text("Text 1")
                Text("Text 2")
                Text("Text 3")
                NavigationLink(destination: DetailView(), isActive: $showDetail) {
                    LinkView(showDetails: $showDetail)

                }
            }
        }
    }
}

struct LinkView: View {
    @Binding var showDetails: Bool

    var body: some View {
        Button(action: {
            self.showDetails = false
        }) {
            Text("Open Details")
        }
    }
}

struct DetailView: View {
    var body: some View {
        Text("Detail View")
    }
}

この場合、ナビゲーション リンクで詳細ページが開かないようにするにはどうすればよいですか? これはSDKのバグですか?

ps XCode バージョン:13.3.1および iOS バージョン (実デバイス):13.3.1

編集

ScrollView実際のアプリにアイテムのリストがあるため、 List を置き換えることができないためForEach、使用を検討して回答を投稿しないでくださいScrollView

4

2 に答える 2

6

実際のアプリでは、ボタンのアクション内でビジネス ロジックが発生する場合があります。

少し論理的であるように思われます.条件付きでリンクを無効にするだけです(そして、リンクが視覚的に利用できないことをユーザーに通知します)

NavigationLink(...).disabled(onCondition)

どこ

func disabled(_ disabled: Bool) -> some View

パラメーター

無効

ユーザーがこのビューを操作できるかどうかを決定するブール値。

戻り値

ユーザーがこのビューを操作できるかどうかを制御するビュー。

討論

ビュー階層の上位のビューは、このビューで設定した値をオーバーライドできます。次の例では、外側の disabled(_:) 修飾子が内側の修飾子をオーバーライドするため、ボタンはインタラクティブではありません。

HStack {
    Button(Text("Press")) {}
    .disabled(false)
}
.disabled(true)
于 2020-02-29T14:07:04.110 に答える