Загрузить больше после перехода в нижнюю часть UITableView

Для своего приложения я использую свойство «загрузить больше внизу», как показано ниже. На самом деле он отлично работает; Единственная проблема заключается в том, что когда пользователь достигает кнопки, пока работает функция загрузки, пользователю кажется, что приложение на некоторое время зависает, так как нет анимации, как в UIRefreshcontrol. Как я могу сделать анимацию, показывающую, пока не будут загружены новые данные. Я нашел некоторые свойства UIBottomrefreshcontrol в виде отдельных библиотек, но все они были в Objective-c.

override func viewDidLoad() {
    super.viewDidLoad()

   refreshResults()

 }

 func refreshResults() {


    refreshPage = 40

    // here the query starts
}


func refreshResults2() {

     // here the query starts to add new 40 rows of data to arrays

}


func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,     forRowAtIndexPath indexPath: NSIndexPath) {

    if indexPath.row == refreshPage-1 {
        refreshPage = refreshPage + 40

        refreshResults2()

    }
}

person saner    schedule 06.09.2015    source источник
comment
Вы по-прежнему можете использовать код Objective-C в основном приложении Swift. Или вы можете переписать одну из этих библиотек на Swift, если хотите.   -  person Aaron Brager    schedule 06.09.2015


Ответы (2)


Добавьте UIActivityIndicatorView (т.е. счетчик) в свой UITableViewController. Подключить розетку к коду:

@IBOutlet weak var spinner: UIActivityIndicatorView!

Добавьте свойство в свой UITableViewController, чтобы отслеживать, что вы в настоящее время загружаете больше данных, чтобы не пытаться сделать это дважды:

var loadingData = false

Запустите анимацию счетчика, а затем вызовите refreshResults2():

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if !loadingData && indexPath.row == refreshPage - 1 {
        spinner.startAnimating()
        loadingData = true
        refreshResults2()
    }
}

Запустите refreshResults2() в фоновом потоке. Это позволит вашему столу двигаться свободно. Анимированный счетчик сообщит пользователю, что поступает больше данных. Как только ваш запрос вернется, обновите данные таблицы в основном потоке.

func refreshResults2() {
    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
        // this runs on the background queue
        // here the query starts to add new 40 rows of data to arrays

        dispatch_async(dispatch_get_main_queue()) {
            // this runs on the main queue
            self.refreshPage += 40
            self.tableView.reloadData()
            self.spinner.stopAnimating()
            self.loadingData = false
        }
    }
}
person vacawama    schedule 06.09.2015
comment
У меня бесконечный цикл, и мне не разрешено прокручивать пять первых уже отображаемых. Похоже, что количество строк застряло в первом определении счетчика... - person remjih; 15.12.2016

  • Swift 3 , Xcode 8

  • func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        let lastElement = dataSource.count - 1
        if !loadingData && indexPath.row == lastElement {
            spinner.startAnimating()
            loadingData = true
            loadMoreData()
        }
    }
    

    согласно асинхронному вызову @vacawama в swift 3: -

    func loadMoreData() {
        DispatchQueue.global(qos: .background).async {
            // this runs on the background queue
            // here the query starts to add new 10 rows of data to arrays
            DispatchQueue.main.async {
                 // this runs on the main queue
                    self.spinner.stopAnimating()
                    self.loadingData = false
    
            }
        }
    }
    
    person Abdul Karim    schedule 12.06.2017
    comment
    Это не имеет значения, проблема все еще сохраняется @AbdulKarim - person Mansuu....; 13.10.2017
    comment
    Где вы размещаете spinner в представлении? Под ячейкой-прототипом? - person Mirko; 27.11.2017
    comment
    Спиннер @Mirko находится в представлении, размещенном в UItableview и подключенном к IBOutlet. - person Abdul Karim; 27.11.2017