Home > Back-end >  Automatic slide switching (SwiftUI)
Automatic slide switching (SwiftUI)

Time:04-22

I can not understand why the timer does not work, and the text does not scroll automatically.

I tried to do so:

ForEach(0..<numberText)

But I got such an error:

Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'some View' conform to 'TableRowContent'

Full code:

let numberText = ["text1","text2","text3","text4"]

struct TextNew: View {
    
    private let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect()
    @State private var index = 0
    
    let textdata = TextData.getAllText()
    
    var body: some View {
        
        GeometryReader { proxy in
            
            TabView(selection: $index) {
                
                ForEach(numberText, id: \.self) { num in
                    
                    Text("\(num)")
                        .font(.system(size: 10))
                        .foregroundColor(.white)
                        .tag(num)
                        .padding(.bottom, 50)
                    
                }
            }
            .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
            .frame(height: 80)
            .onReceive(timer, perform: { _ in
                withAnimation {
                    index = index < numberText.count ? index   1 : 0
                    
                }
            })
            
        }
    }
}

Thanks for any help, I'm new

CodePudding user response:

Try this:

struct TextNew: View {
    
    private let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect()
    @State private var index = 1
    @State private var selectedNum: String = ""
    
    var body: some View {
        
        GeometryReader { proxy in
            
            TabView(selection: $selectedNum) {
                
                ForEach(numberText, id: \.self) { num in
                    Text("\(num)")
                        .font(.system(size: 10))
                        .foregroundColor(.white)
                        .padding(.bottom, 50)
                }
            }
            .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
            
            .onReceive(timer, perform: { _ in
                withAnimation {
                    index = index < numberText.count ? index   1 : 1
                    selectedNum = numberText[index - 1]
                }
            })
            
        }
    }
}

Explanation:

The reason for this not working is the type mismatch between your .tag and the $index in your TabView declaration. These have to match. By the way you do not need the .tag here as you are setting it to .self in your ForEach loop.

  • Related