2016-08-29 7 views
5

Интересно, есть ли встроенная функция tableview для добавления бесконечного прокрутки/разбиения на страницы.swift ios добавить бесконечную прокрутку прокрутки в uitableview

Сейчас мой VC выглядит следующим образом:

var data: JSON! = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Init start height of cell 
    self.tableView.estimatedRowHeight = 122 
    self.tableView.rowHeight = UITableViewAutomaticDimension 

    self.tableView.delegate = self 
    self.tableView.dataSource = self 

    savedLoader.startAnimation() 
    //Load first page 
    loadSaved(1) 

} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("aCell") as! SavedTableViewCell 

    let info = data[indexPath.row] 
    cell.configureWithData(info) 

    return cell 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    performSegueWithIdentifier("WebSegue", sender: indexPath) 

    tableView.deselectRowAtIndexPath(indexPath, animated: false) 
} 

Принести свои данные с помощью loadSaved (1) давая функции текущей страницы я хочу, чтобы загрузить. Функция делает запрос API с использованием alomofire, а затем заполняет данные var: JSON! = [] с данными, которые должны быть отображены

Так что я хочу сделать, это когда я прокручиваю в нижней части Tableview loadSaved (2) следует называть При загрузке данных в Tableview

+0

Мой ответ здесь может помочь вам https://stackoverflow.com/questions/28246394/showing-cells-in-demands-in-uicollectionview-with-vertical-infinite-scroll –

ответ

2

Нет, UITableView не имеет встроенной функции для достижения бесконечной прокрутки или нагрузки по запросу таких, как вы хотите. То, что вы можете использовать, - это функция scrollViewDidScroll(_:) в UIScrollViewDelegate, реализованная по умолчанию в UITableView и таким образом знать, когда пользователь прокручивается больше, чем исходная высота, определенная в UITableView.

Например, как в этом коде:

var indexOfPageToRequest = 1 

override func scrollViewDidScroll(scrollView: UIScrollView) { 

    // calculates where the user is in the y-axis 
    let offsetY = scrollView.contentOffset.y 
    let contentHeight = scrollView.contentSize.height 

    if offsetY > contentHeight - scrollView.frame.size.height { 

     // increments the number of the page to request 
     indexOfPageToRequest += 1 

     // call your API for more data 
     loadSaved(indexOfPageToRequest) 

     // tell the table view to reload with the new data 
     self.tableView.reloadData() 
    } 
} 

Для достижения результата добавьте остальные элементы в конце UITableView вы должны добавить новые элементы к источнику данных, в вашем случае data внутри ваша функция loadSaved(numberOfPage).

Я надеюсь, что это поможет вам.

16

UITableViewDelegate имеет table​View(_:​will​Display:​for​Row​At:​) instance method, который «говорит делегату, что табличный вид собирается рисовать ячейку для определенной строки».

В вашем случае я хотел бы использовать это что-то вроде этого:

override open func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    if indexPath.row == data.count-1 { //you might decide to load sooner than -1 I guess... 
     //load more into data here 
    } 
} 

В зависимости от вашего кода, вам может понадобиться некоторые проверки вокруг этого, чтобы гарантировать, что Вы не до конца в бесконечном цикле, если вы имеете загружены все данные ...

2

Я измененный ответ Виктора и использовал его в качестве,

var indexOfPageRequest = 1 
var loadingStatus = false 

func loadData(){ 
    if !loadingStatus{ 
     loadingStatus = true 
     viewModel.getData(pageIndex: indexOfPageRequest) 
    } 
} 

override func scrollViewDidScroll(_ scrollView: UIScrollView) { 

    // calculates where the user is in the y-axis 
    let offsetY = scrollView.contentOffset.y 
    let contentHeight = scrollView.contentSize.height 

    if offsetY > contentHeight - scrollView.frame.size.height { 

     // increments the number of the page to request 
     indexOfPageRequest += 1 

     // call your API for more data 
     loadData() 

     // tell the table view to reload with the new data 
     self.tableView.reloadData() 
    } 
} 

Reset loadingStatus истину при приеме данных. Без проверки того, что представление уже загружает больше данных, табличное представление мерцало.

+0

что, если наша TableView не начать сверху, но снизу? как я могу сделать такую ​​проверку в этом случае? – Faruk

+0

Этот способ больше потребляет процессор. Лучше проверить, в какой строке находится пользователь, затем прокручивается. –

0

Выше Ans также правы, но может быть, некоторые тоже помогут в этом коде.

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath){ 
    if(indexPath.row == self.arryOfData.count-1){ 
     if(self.pageNumber <= self.resPgNumber){ 
      if(remaining != 0){ 
       let spinner = UIActivityIndicatorView(activityIndicatorStyle: .gray) 
       spinner.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(44)) 
       spinner.startAnimating() 
       tableView.tableFooterView = spinner 
       tableView.tableFooterView?.isHidden = false 

       DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { 
        self.flgActivity = false 
        self.getActiveOrdersList() 
       } 
      } 
      else{ 
       tableView.tableFooterView?.removeFromSuperview() 
       let view = UIView() 
       view.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(5)) 
       tableView.tableFooterView = view 
       tableView.tableFooterView?.isHidden = true 
      } 
     } 
     else{ 
      tableView.tableFooterView?.removeFromSuperview() 
      let view = UIView() 
      view.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(5)) 
      tableView.tableFooterView = view 
      tableView.tableFooterView?.isHidden = true 
     } 
    } 
    else{ 
     tableView.tableFooterView?.removeFromSuperview() 
     let view = UIView() 
     view.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: tableView.bounds.width, height: CGFloat(5)) 
     tableView.tableFooterView = view 
     tableView.tableFooterView?.isHidden = true 
    } 
} 
+0

Мне нравится, как вы проверяете строку, которая должна отображаться, но почему вы добавляете скрытый вид на 3 места с тем же кодом? –