swiftUI 2.0列表滚动很慢,我找不到原因..即使是保罗哈德森的伎俩也不起作用

Posted

技术标签:

【中文标题】swiftUI 2.0列表滚动很慢,我找不到原因..即使是保罗哈德森的伎俩也不起作用【英文标题】:swiftUI 2.0 list is very slow to scroll, I can't find the reason.. Even the Paul Hudson trick doesn't work 【发布时间】:2020-12-10 16:49:45 【问题描述】:

这是我的代码,我解码一个很长的 json,使用一个对象,@State,...这里有什么问题,为什么滚动如此之慢? 我通过添加 .id(UUID()) 广告列表级别尝试了 Paul Hudson 技巧,但没有成功。这与我放置不好的 dispatchingQueue.main.async 有关吗?真的我不知道。 换行符:双空格或 欢迎任何帮助!

import SwiftUI

struct ContentView: View 


@State private var shifts = [Shift]()
    
    
    
    var body: some View 
       
        
        NavigationView 
             
              
            
                List(shifts, id: \.id)  shift in
                
                                HStack() 
                                Text(shift.date)
                                    .font(.caption2)
                                padding()
                                Text(shift.name)
                                    .font(.footnote)
                                padding()
                                Text(shift.planned)
                                    .font(.footnote)
                                Text(":")
                                    .font(.footnote)
                                Text(shift.replaced)
                                    .font(.footnote)
                               
                            
                    
                .id(UUID())
                
          
            
        .onAppear(perform: 
            loadData()
        )
        
            
        
       
        
            
        
    
    
        
    
extension ContentView

    func loadData() 
        let login = "xxx"
        let password = "xxxx!"
        let ftpServer = "www.xxxx.be"
        let fileName = "export.json"
        let ftpUrl =  "ftp://\(login):\(password)@\(ftpServer)/\(fileName)"
       
        guard let url = URL(string: ftpUrl) else 
           print("error connection")
            return
        
        
        let request = URLRequest(url: url)
        URLSession.shared.dataTask(with: request)  data, response, error in
            
            if let data = data 
                            if let ShiftDataStore = try? JSONDecoder().decode(ShiftDataStore.self, from: data) 
                                
                                
                                DispatchQueue.main.async 
                                    self.shifts = ShiftDataStore.shifts
                                
                            
                        
                        
                    .resume()
      
    






import Foundation

struct Shift: Decodable,Hashable 
    
    var name: String
    var planned: String
    var replaced: String
    var gsm: String
    var function: String
    var replacedFunction : String
    var date: String
    var id: UUID = UUID()

       
    
    enum CodingKeys: String, CodingKey 
            
            case name = "N"
            case planned = "S"
            case replaced = "RS"
            case gsm = "M"
            case function = "R"
            case replacedFunction = "RR"
            case date = "D"
            
    
        
   
     init(from decoder: Decoder) throws 
            let values = try decoder.container(keyedBy: CodingKeys.self)

        name = try values.decode(String.self, forKey: .name)
        planned = try values.decode(String.self, forKey: .planned)
        replaced = try values.decode(String.self, forKey: .replaced)
        gsm = try values.decode(String.self, forKey: .gsm)
        function = try values.decode(String.self, forKey: .function)
        replacedFunction = try values.decode(String.self, forKey: .replacedFunction)
        date = try values.decode(String.self, forKey: .date)
        
        
            
        
    


    struct ShiftDataStore: Decodable 
        var shifts: [Shift]
    
    

【问题讨论】:

尝试将列表行的内容移动到以shift作为输入数据的单独子视图中。 没有成功...同样的结果。谢谢您的回复。 我使用 combine、Observable 等更改代码,没有变化的数据加载很快,但无法滚动数据 【参考方案1】:

通过将 padding() 更改为 spacer() 修复了滚动问题。 感谢阅读和帮助!

【讨论】:

以上是关于swiftUI 2.0列表滚动很慢,我找不到原因..即使是保罗哈德森的伎俩也不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 列表/表单中禁用滚动

列表不滚动(在 SwiftUI 中——为了消除其他问题的歧义)

SwiftUI 列表禁用单元格按下

尝试删除最后一个元素时,带有子项的 SwiftUI (2.0) 列表崩溃

异步加载联系人列表中的图像

ScrollView 位置数据 / SwiftUi