无法解决SwiftUI中的滚动视图

问题描述 投票:0回答:1

有人可以向我解释一下 ScrollView 的工作原理吗?当我收到一条消息时,如何滚动到最后一条消息( item )?

我尝试用,

ScrollViewReader { proxy in }
来实现它,但我仍然无法使这段代码工作。

我也尝试将其设为“ .onchange(of: ) { } ”(使用 ScrollViewReader)

struct ContentView: View{
    @ObservedObject var viewModel = ViewModel()
    
    @State var text = ""
    @State var models = [String]()
    
    var body: some View {
        VStack(alignment: .leading) {
            
            ScrollViewReader { proxy in
                ScrollView (showsIndicators: false){
                    ForEach(models, id: \.self){ string in
                        Text(string)
                        
                            .font(.headline)
                            .padding()
                            .background(Color("Text"))
                            .cornerRadius(10)
                            .overlay(RoundedRectangle(cornerRadius: 10).strokeBorder(.blue, style: .init(lineWidth: 1))
                            )
                        Divider()
                        
                    }
                    .onChange(of: models){
                        proxy.scrollTo(models.last)
                    }
                }
            }
            
            
            Spacer()
            
            HStack{
                TextField("Type here...", text: $text)
                    .padding(15.0)
                    .padding(.horizontal)
                
                Button(){
                    send()
                } label: {
                    Image(systemName: "arrow.up.circle.fill")
                        .font(.system(size: 40))
                        .foregroundColor(Color("Button"))
                }
                .padding(10.0)
            }
            .overlay(
                RoundedRectangle(cornerRadius: 100)
                    .stroke(Color("Stroke"), lineWidth: 1)
            )
        }
        .onAppear{
            viewModel.setup()
        }
        .padding()
        .background(/*@START_MENU_TOKEN@*//*@PLACEHOLDER=View@*/Color("Background")/*@END_MENU_TOKEN@*/)
    }
    
    
    func send() {
        guard !text.trimmingCharacters(in: .whitespaces).isEmpty else {
            return
        }
        models.append("Me: \(self.text)")
        viewModel.send(text: text) { response in
            DispatchQueue.main.async {
                self.models.append("Answer: "+response)
                self.text = ""
            }
        }
    }
}

......................................

swift swiftui scroll scrollview
1个回答
0
投票

使用不同的重载:

proxy.scrollTo(models.last,anchor:.top)
© www.soinside.com 2019 - 2024. All rights reserved.