首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SwiftUI:支持多通道

SwiftUI:支持多通道
EN

Stack Overflow用户
提问于 2019-07-19 07:29:59
回答 8查看 9.2K关注 0票数 36

我正在尝试设置一个视图,它可以根据点击的按钮显示多个模态。

当我只添加一个sheet时,一切都正常:

代码语言:javascript
运行
复制
.sheet(isPresented: $showingModal1) { ... }

但是当我添加另一个工作表时,只有最后一个工作表有效。

代码语言:javascript
运行
复制
.sheet(isPresented: $showingModal1) { ... }
.sheet(isPresented: $showingModal2) { ... }

更新

我试图让它正常工作,但我不确定如何为modal声明类型。我收到一个Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements的错误。

代码语言:javascript
运行
复制
struct ContentView: View {
    @State var modal: View?
    var body: some View {
        VStack {
            Button(action: {
                self.modal = ModalContentView1()
            }) {
                Text("Show Modal 1")
            }
            Button(action: {
                self.modal = ModalContentView2()
            }) {
                Text("Show Modal 2")
            }
        }.sheet(item: self.$modal, content: { modal in
            return modal
        })
    }
}

struct ModalContentView1: View {
    var body: some View {
        Text("Modal 1")
    }
}

struct ModalContentView2: View {
    var body: some View {
        Text("Modal 2")
    }
}
EN

Stack Overflow用户

发布于 2019-09-10 22:48:13

我个人会模仿一些NavigationLink应用编程接口。然后,您可以创建一个hashable枚举,并决定要呈现哪个模式表。

代码语言:javascript
运行
复制
extension View {
  func sheet<Content, Tag>(
    tag: Tag,
    selection: Binding<Tag?>,
    content: @escaping () -> Content
  ) -> some View where Content: View, Tag: Hashable {
    let binding = Binding(
      get: {
        selection.wrappedValue == tag
      },
      set: { isPresented in
        if isPresented {
          selection.wrappedValue = tag
        } else {
          selection.wrappedValue = .none
        }
      }
    )
    return background(EmptyView().sheet(isPresented: binding, content: content))
  }
}

enum ActiveSheet: Hashable {
  case first
  case second
}

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

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

struct TestView: View {
  @State
  private var _activeSheet: ActiveSheet?

  var body: some View {
    print(_activeSheet as Any)
    return VStack
      {
        Button("first") {
          self._activeSheet = .first
        }
        Button("second") {
          self._activeSheet = .second
        }
      }
      .sheet(tag: .first, selection: $_activeSheet) {
        First()
      }
      .sheet(tag: .second, selection: $_activeSheet) {
        Second()
      }
  }
}
票数 2
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57103800

复制
相关文章

相似问题

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