簡體   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