SwiftUI,使用actionSheet时出现奇怪的NavigationLink行为

时间:2020-05-29 18:36:18

标签: ios swift swiftui

在让他/她进入之前,我想先检测用户是否满足先决条件。如果不满足先决条件,应用程序将弹出一个actionSheet并向用户显示一些解锁功能的方法。 当我点击文本时,它的工作原理非常好。但是当我点击列表上的空白处时。它只是跳过绑定。奇怪的是,在我的实际项目中,即使我仅将其设置为false,绑定也将变为“ true”。 这是问题。我使用的是正确的方法还是错过了什么?还是这是一个错误? 谢谢。

struct ContentView: View {
    @State var linkOne = false
    @State var linkTwo = false
    @State var linkThree = false
    @State var actionOne = false
    @State var actionTwo = false
    @State var actionThree = false
    var body: some View {
        NavigationView{
            List{
                        NavigationLink("Destination View One", destination: DestOneView(), isActive: self.$linkOne)
                            .actionSheet(isPresented: self.$actionOne) { () -> ActionSheet in
                                ActionSheet(title: Text("Hello"), message:Text("This is weird"), buttons: [ActionSheet.Button.cancel()])
                        }.onTapGesture {
                            self.actionOne = true
//                            self.linkOne = true
                        }
                        NavigationLink("Destination View Two", destination: DestTwoView(), isActive: self.$linkTwo)
                        .actionSheet(isPresented: self.$actionTwo) { () -> ActionSheet in
                        ActionSheet(title: Text("Hello"), message:Text("This is weird"), buttons: [ActionSheet.Button.cancel()])
                        }
                        .onTapGesture {
                            self.actionTwo = true
//                            self.linkTwo = true
                        }
                        NavigationLink("Destination View Three", destination: DestThreeView(), isActive: self.$linkThree)
                        .actionSheet(isPresented: self.$actionThree) { () -> ActionSheet in
                        ActionSheet(title: Text("Hello"), message:Text("This is weird"), buttons: [ActionSheet.Button.cancel()])
                        }
                        .onTapGesture {
                            self.actionThree = true
//                            self.linkThree = true
                        }
                    }
        }

    }
}

其他三个视图。

struct DestOneView: View {
    var body: some View {
        Text("First View")
    }
}

struct DestTwoView: View {
    var body: some View {
        Text("Second View")
    }
}

struct DestThreeView: View {
    var body: some View {
        Text("Third View")
    }
}

2 个答案:

答案 0 :(得分:2)

通常,在List中,覆盖手势不能很好地工作。解决方案之一是使用Button来显示NavigationLink

import SwiftUI

struct ContentView: View {
    @State private var linkOne = false
    ...

    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: SomeView(), isActive: $linkOne) {
                    EmptyView() 
                }

                Button(action: {
                    // here you can perform actions
                    self.linkOne = true
                }, label: {
                    Text("Some text!")
                })

                Spacer()
            }
        }
    }
}

答案 1 :(得分:0)

当我回来测试我的代码时。该解决方案并没有真正起作用。可能是由于列表的错误。另一则帖子上的人说,如果工作表位于列表中,则新视图中的列表仅显示一次。因此,当我在Xcode 11.5版中点击按钮时,在新视图中只有一个空列表。出于某种原因,如果我使用NavigationView,则所有内容都会缩小到视图的中间,而不是对齐到顶部。

我的解决方法是在.onAppear中设置Binding。视图加载时将弹出actionSheet。然后使用presentationMode方法返回上一个视图。

@Environment(\.presentationMode) var presentationMode
.
.
.
ActionSheet.Button.default(Text("Dismiss"), action: {
          self.presentationMode.wrappedValue.dismiss()}