首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个工作表(isPresented:)在SwiftUI中不工作

多个工作表(isPresented:)在SwiftUI中不工作
EN

Stack Overflow用户
提问于 2019-11-13 12:19:58
回答 21查看 38.3K关注 0票数 150

这个ContentView有两个不同的模态视图,所以我对两者都使用了sheet(isPresented:),但似乎只有最后一个会出现。我怎样才能解决这个问题?还是不可能在SwiftUI中的视图上使用多个工作表?

代码语言:javascript
运行
复制
struct ContentView: View {
    
    @State private var firstIsPresented = false
    @State private var secondIsPresented = false
    
    var body: some View {
        NavigationView {
            VStack(spacing: 20) {
                Button("First modal view") {
                    self.firstIsPresented.toggle()
                }
                Button ("Second modal view") {
                    self.secondIsPresented.toggle()
                }
            }
            .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
            .sheet(isPresented: $firstIsPresented) {
                    Text("First modal view")
            }
            .sheet(isPresented: $secondIsPresented) {
                    Text("Only the second modal view works!")
            }
        }
    }
}

上面的代码编译时没有警告(Xcode 11.2.1)。

EN

回答 21

Stack Overflow用户

回答已采纳

发布于 2020-07-30 21:44:43

UPD

Xcode 12.5.0Beta3(2021年3月3日)开始,这个问题不再有意义了,因为现在可以连续使用多个.sheet(isPresented:).fullScreenCover(isPresented:),并且问题中的代码将很好地工作。

尽管如此,我仍然认为这个答案仍然有效,因为它很好地组织了表单,并使代码更加清晰和可读性更好--您有一个真理的来源,而不是几个独立的布尔人。

实际答案

最好的方法,这也适用于iOS 14

代码语言:javascript
运行
复制
enum ActiveSheet: Identifiable {
    case first, second
    
    var id: Int {
        hashValue
    }
}

struct YourView: View {
    @State var activeSheet: ActiveSheet?

    var body: some View {
        VStack {
            Button {
                activeSheet = .first
            } label: {
                Text("Activate first sheet")
            }

            Button {
                activeSheet = .second
            } label: {
                Text("Activate second sheet")
            }
        }
        .sheet(item: $activeSheet) { item in
            switch item {
            case .first:
                FirstView()
            case .second:
                SecondView()
            }
        }
    }
}

在这里阅读更多信息:https://developer.apple.com/documentation/swiftui/view/sheet(item:ondismiss:content:)

要隐藏工作表,只需设置activeSheet = nil

奖励:,如果您希望工作表是全屏的,那么使用完全相同的代码,但不要使用.sheet编写.fullScreenCover

票数 180
EN

Stack Overflow用户

发布于 2019-11-13 12:34:42

请尝试下面的代码

更新答案(iOS 14,Xcode 12)

代码语言:javascript
运行
复制
enum ActiveSheet {
   case first, second
   var id: Int {
      hashValue
   }
}

struct ContentView: View {

    @State private var showSheet = false
    @State private var activeSheet: ActiveSheet? = .first

    var body: some View {
    
        NavigationView {
            VStack(spacing: 20) {
                Button("First modal view") {
                    self.showSheet = true
                    self.activeSheet = .first
                }
                Button ("Second modal view") {
                    self.showSheet = true
                    self.activeSheet = .second
                }
            }
            .navigationBarTitle(Text("Multiple modal view problem"), displayMode: .inline)
            .sheet(isPresented: $showSheet) {
                if self.activeSheet == .first {
                    Text("First modal view")
                }
                else {
                    Text("Only the second modal view works!")
                }
            }
        }
    }
}
票数 79
EN

Stack Overflow用户

发布于 2020-01-13 23:31:35

还可以将工作表添加到放置在视图背景中的EmptyView中。这可以多次完成:

代码语言:javascript
运行
复制
  .background(EmptyView()
        .sheet(isPresented: isPresented, content: content))
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58837007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档