Skip to content

Un mecanismo simple para paginado en UITableView

Notifications You must be signed in to change notification settings

osmely/EasyPaginator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 

Repository files navigation

EasyPaginator

Un mecanismo simple para paginado en UITableView que permite llevar el control de los datos que se agregan evitando duplicados y llevando la ultima página agregada.

Modo de uso

Declarar el paginable, que contiene la estructura de datos de la app.

struct PaginableUser : PaginableObject {
    typealias type = User
    
    static func == (lhs: PaginableUser, rhs: PaginableUser) -> Bool {
        return lhs.data.id == rhs.data.id
    }
    
    var data: User
    var page: Int
}

Crear el paginador

  let paginator = PaginableArray<PaginableUser>()

En contexto dentro de la clase usar como se muestra a continuación:

    //pedir nueva página
    func nextUserPage() {
        let page = self.paginator.lastPageAdded + 1
        self.requestUser(keywords: self.text, page: page)
    }
    
    func requestUser(keywords:String?, page:Int) {
        
        GetUsersRequest(
            keyword: keywords,
            contactsOnly: false,
            page: page
        ).rx_execute()
            .subscribe(
                onNext: { [weak self] (users) in
                
                    self?.refreshControl.endRefreshing()
                    
                    //en el refresh se pide a server con page 1, 
                    //y el paginador tiene data, entonces limpiar!
                    if page == 1 {
                        self?.paginator.clear()
                    }
                
                    //agregando objetos paginables
                    self?.paginator.add(users.map{PaginableUser($0, page: page)})

                    self?.tableview.reloadData()
                    self?.isLoading.accept(false)
                },
                onError: { [weak self](error) in
                    self?.refreshControl.endRefreshing()
            }).disposed(by: self.disposeBag)
        
    }
    
    
    //UITableViewDelegate, UITableViewDataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        self.placeholder?.animatePlaceholderView(showPlaceholder: self.paginator.elements.isEmpty, animated: true)
        return self.paginator.elements.count
    }
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if (self.paginator.elements.count-1) == indexPath.row && !self.paginator.isLast {
            self.nextUserPage()
        }
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        ....
    }

Instalación

Simplemente agrege el único fichero .swift en algun lugar del proyecto.

About

Un mecanismo simple para paginado en UITableView

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages