ios - 使组合直通发布者不那么全局化

标签 ios swift swiftui combine

swift 5,iOS 13
我想使用 passthroughSubject 发布者;但我的直觉告诉我它是一个全局变量,因此非常糟糕的做法。如何使这个全局变量不那么全局,同时仍然可用。这是一些代码来显示我在说什么。
我知道有很多其他方法可以做到这一点,但我想创建一些简单的代码来说明这个问题。

import SwiftUI
import Combine

let switcher = PassthroughSubject<Void,Never>()

struct SwiftUIViewF: View {
@State var nextPage = false
var body: some View {

  VStack {
    Text("Switcher")
    .onReceive(switcher) { (_) in
      self.nextPage.toggle()
    }
    if nextPage {
      Page1ViewF()
    } else {
      Page2ViewF()
    }
  }

 }
}

struct Page1ViewF: View {
  var body: some View {
    Text("Page 1")
    .onTapGesture {
        switcher.send()
    }
  }
}

struct Page2ViewF: View {
  var body: some View {
    Text("Page 2")
    .onTapGesture {
      switcher.send()
    }
  }
}

struct SwiftUIViewF_Previews: PreviewProvider {
  static var previews: some View {
    SwiftUIViewF()
  }
}

最佳答案

这是可能的解决方案 - 将其保存在父 View 中并注入(inject) subview :

struct SwiftUIViewF: View {
let switcher = PassthroughSubject<Void,Never>()

@State var nextPage = false
var body: some View {

  VStack {
    Text("Switcher")
    .onReceive(switcher) { (_) in
      self.nextPage.toggle()
    }
    if nextPage {
      Page1ViewF(switcher: switcher)
    } else {
      Page2ViewF(switcher: switcher)
    }
  }

 }
}

struct Page1ViewF: View {
  let switcher: PassthroughSubject<Void,Never>
  var body: some View {
    Text("Page 1")
    .onTapGesture {
        self.switcher.send()
    }
  }
}

struct Page2ViewF: View {
  let switcher: PassthroughSubject<Void,Never>
  var body: some View {
    Text("Page 2")
    .onTapGesture {
      self.switcher.send()
    }
  }
}

关于ios - 使组合直通发布者不那么全局化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62756051/

相关文章:

ios - 在 Xcode 6 Beta 4 中,SKShapeNode 不再起作用

ios - GestureRecognizer 不能动态工作/在额外的类 swift 中工作

SwiftUI:带有动画栏的步进器

ios - ios7 多点连接消息发送失败

iphone - 如何在分离的 UITableViewCell 和另一个 View 之间执行 segue

swift - 什么是 Objective C 运行时特性?

swift - 如何在 SwiftUI 中的列表下方添加按钮?

ios - 将 UITableViewController 转换为 SwiftUI 后,UITableViewCell 中的 View 为零

swift - 表单中各部分之间的间距

ios - 如果当前在屏幕上不可见,是否可以获取 View Controller 的快照,包括其状态栏?