es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se puede hacer “arrastrar para actualizar” una cuadrícula de vista (LazyVGrid) en SwiftUI?

¿Cómo se arrastra para actualizar una vista de cuadrícula en SwiftUI? Sé que se puede hacer con una vista de lista con el modificador refreshable en iOS 15, pero ¿cómo se puede hacer con un LazyVGrid? ¿Cómo lo harías en una vista de lista o cuadrícula anterior a iOS 15? Soy bastante nuevo en SwiftUI. Adjunté un gif que muestra lo que intento lograr.

Arrastrar para refrescar

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para actualizar un LazyVGrid mediante deslizar hacia abajo en SwiftUI, puedes utilizar el método “OnRefresh” disponible en iOS 15. Sin embargo, si estás trabajando con una versión más antigua de iOS, puedes lograr esta funcionalidad siguiendo estos pasos:

    1. Crea una vista personalizada de control de actualización mediante la subclase UIRefreshControl y agregando tu propia implementación personalizada.
    import UIKit
    
    class CustomRefreshControl: UIRefreshControl {
    
        var onRefresh: (() -> Void)?
    
        override init() {
            super.init()
            setup()
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        private func setup() {
            addTarget(self, action: #selector(refresh), for: .valueChanged)
        }
    
        @objc private func refresh() {
            onRefresh?()
        }
    
        func endRefreshingManually() {
            endRefreshing()
        }
    
    }
    
    1. Agrega el control de actualización personalizado a tu vista LazyVGrid y establece la propiedad “onRefresh” con la acción de actualización deseada.
    struct ContentView: View {
        @State private var items = [Item(id: 1), Item(id: 2), Item(id: 3)]
    
        var body: some View {
            let refreshControl = CustomRefreshControl()
            refreshControl.tintColor = .gray
            refreshControl.onRefresh = {
                // Aquí va la acción de actualización
                DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
                    self.items.append(Item(id: self.items.count + 1))
                    refreshControl.endRefreshingManually()
                }
            }
    
            return ScrollView {
                LazyVGrid(columns: [GridItem(.adaptive(minimum: 150), spacing: 16, alignment: .top)], spacing: 16) {
                    ForEach(items) { item in
                        // Aquí va la implementación de la celda de la cuadrícula
                    }
                }
                .padding(.horizontal)
                .padding(.top, 16)
                .padding(.bottom, 64)
                .refreshControl(refreshControl)
            }
        }
    }
    

    Siguiendo estos pasos, deberías poder lograr una funcionalidad de arrastrar para actualizar tanto para List como para LazyVGrid en SwiftUI.

Comments are closed.