[英]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
版本,因為這里發布者的Error
是Never
。 無論如何,這里有一些包含上述更改的內容:
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.