繁体   English   中英

如何使用 collect 在 SwiftUI 中创建视图

[英]How to create views in SwiftUI using collect

我试图找出一种使用collect()运算符在 SwiftUI 中的 VStack 中插入多个视图数组的方法。

struct ChatsTab: View {
    var subscriptions = Set<AnyCancellable>()
    var body: some View {
        VStack {
            ["A", "B", "C", "D", "E"].publisher.collect(2).sink(receiveCompletion: { _ in
                // Do nothing on completion
            }) { (stringArray) in
                HStack {
                    Text(stringArray[0])
                    Text(stringArray[1])
                }
            }
        .store(in: &subscriptions)
        }
    }
}

但我收到以下错误:

Cannot convert value of type '()' to closure result type '_'

我只想使用collect来做到这一点,这样我就可以成对添加我的文本视图。 我知道我还有其他选择,但我只想通过collect来完成它。

你只需要重新安排事情。 真正的问题不是collect ,问题是您试图在VStack内执行任意代码。 VStack是一个函数构建器,在它的大括号之间是一个视图列表,可能还有一些基本的if逻辑。 不是任意代码,就像您包含在常规函数中的那种。 因此,如果您从 VStack 中取出发布者代码,它将编译。 你把它放在哪里取决于你,你可以把它放在init() ,从另一个函数调用,或者 int didAppear视图修饰符(只是不直接在 VStack 内)。

第二个问题是 collect 将发布另一个数组(长度为 2 的数组)。 你最终会得到一个 String 数组的数组(或者你可以在它们发布时使用它们而不是保留它们,这取决于你想要做什么)。 您也可以使用更简单的sink版本,因为这里发布者的ErrorNever 无论如何,这里有一些包含上述更改的内容:


import SwiftUI
import Combine

var subscriptions = Set<AnyCancellable>()

struct ContentView: View {

  @State var stringArrays: [[String]] = []

    var body: some View {
      ForEach(stringArrays, id: \.self) { stringArray in
        HStack {
          Text(stringArray.count > 0 ? stringArray[0] : "")
          Text(stringArray.count > 1 ? stringArray[1] : "")
        }
      }.onAppear() {
        ["A", "B", "C", "D", "E"].publisher
          .collect(2)
          .sink(receiveValue: { (stringArray) in
            self.stringArrays.append(stringArray)
          }).store(in: &subscriptions)
      }
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM