我有一個 TabView,其中我有一個 ForEach 回圈用于其中的各種專案,我想使用自動更改選擇索引的計時器來更改 TabView 專案的選擇。我可以使用具有array.indicesor的 ForEach 回圈來實作它,0..<array.count但是由于使用前面提到的方法是不安全的,所以我想將陣列本身簡單地傳遞到 ForEach 回圈中,但是在 foreach 回圈中簡單地使用陣列不會改變使用計時器或其他編程方式選擇的索引。用戶需要手動滾動以更改選擇。以下是我嘗試過的代碼行,任何人都可以指出我做錯了什么。
struct ContentView: View {
@State var currentIndex = 0
@State var itemNames = [ItemNames]()
@State var timer: Timer.TimerPublisher = Timer.publish (every: 6, on: .main, in: .common)
var body: some View {
TabView(selection: $currentIndex) {
ForEach(itemNames, id: \.id) { item in
Text(item.name).tag(Int(item.id))
}
}.tabViewStyle(.page(indexDisplayMode: .never))
.onReceive(timer, perform: {
_ in withAnimation {
currentIndex = currentIndex < itemNames.count ? currentIndex 1 : 0
}
}).onDisappear {
self.cancelTimer()
}.onAppear {
setDemoNames()
self.instantiateTimer()
_ = self.timer.connect()
}
}
func instantiateTimer() {
self.timer = Timer.publish (every: 6, on: .main, in: .common)
return
}
func cancelTimer() {
self.timer.connect().cancel()
return
}
func setDemoNames(){
let item1 = ItemNames(id: "1", name: "John")
let item2 = ItemNames(id: "2", name: "Mark")
let item3 = ItemNames(id: "3", name: "Steve")
let item4 = ItemNames(id: "4", name: "Peter")
itemNames = [item1, item2, item3, item4]
}
}
struct ItemNames : Identifiable, Hashable {
var id:String, name:String;
init(id: String, name: String) {
self.id = id
self.name = name
}
}
uj5u.com熱心網友回復:
型別必須完全匹配
將您的標簽更改為
.tag(Int(item.id) as! Int)
上面的行有效,因為它洗掉了可選/強制。
您必須確保item.id遺囑始終有效Int
Int(item.id)產生一個型別的值,Int?因為它可能會失敗
您也可以執行以下操作以不強制,但如果由于某種原因您有 2 個失敗的 id,您可能會有重復的標簽。
.tag((Int(item.id) ?? itemNames.count 1) as Int)
這很容易出現錯誤,它只能在非常特定的情況下作業,并且幾乎沒有后備。
我會將選擇變數切換為String并保留tag原始變數,id然后創建一個函式來拉下一個id以使用計時器進行設定。
沒有強制或選項。
您也可以通過制作idandInt而不是 aString
uj5u.com熱心網友回復:
ForEach您可以安全地在using中獲取索引zip:
ForEach(Array(zip(itemNames, itemNames.indices)), id: \.0) { item, index in
由于itemNames是可識別的,所以不需要使用id: \.id,所以通常可以這樣做:
ForEach(itemNames) { item in
SwiftUI 將itemNames.id用作ForEach id:. 使用zip,它回傳序列對而不是陣列,然后您將 zip 序列轉換回元組陣列。您需要做的ForEach id:就是將 傳遞給它Identifiable,在這種情況下,它是元組的第一個,或者.0. 這為您提供了正確可識別ForEach的內容,.onDelete并為您提供了當前的索引item。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412000.html
標籤:
上一篇:如何使用輸入欄位使變數作業?
