2016-02-23 3 views
0

У меня есть UITableViewController (вместо PFQueryTableViewController), чтобы отобразить результаты моего запроса, и у меня есть массив хранения текстов. Поскольку запрос будет извлекать огромное количество данных, я хотел бы, чтобы мой tableView загружал больше результатов, как только пользователь прокрутит страницу вниз. Есть много решений, но они либо в JSON, либо в ObjectiveC, и они кажутся мне очень расплывчатыми, поскольку я всего лишь новичок.Как загрузить больше ячеек в UITableView SWIFT

class queryResultsViewController: UITableViewController { 

var texts = [String]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    let query = PFQuery(className: "allPosts") 

    query.whereKey("userId", equalTo: (PFUser.currentUser()?.objectId)!) 
    query.orderByDescending("createdAt") 

    query.findObjectsInBackgroundWithBlock { (posts, error) -> Void in 

     if let posts = posts { 

      self.texts.removeAll(keepCapacity: true) 

      for post in posts { 

       self.captionOne.append(post["text"] as! String) 

       self.tableView.reloadData() 
      } 
     } 
    } 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // #warning Incomplete implementation, return the number of sections 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // #warning Incomplete implementation, return the number of rows 
    return texts.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! theCell 

    cell.TextView.text = texts[indexPath.row] 

    return cell 
} 
+0

Это называется бесконечным прокруткой, попробуйте выполнить поиск в github. Не строите колесо самостоятельно, если не нужно. –

ответ

0

Чтобы определить, когда пользователь прокрутил в нижней части UITableView, вы можете реализовать метод UIScrollView делегат scrollViewDidScroll:

пример реализации (преобразованного в Swift из: https://stackoverflow.com/a/5627837/3933375)

override func scrollViewDidScroll(scrollView: UIScrollView) { 
    let offset = scrollView.contentOffset 
    let bounds = scrollView.bounds 
    let size = scrollView.contentSize 
    let inset = scrollView.contentInset 
    let y = CGFloat(offset.y + bounds.size.height - inset.bottom) 
    let h = CGFloat(size.height) 

    let reload_distance = CGFloat(10) 
    if(y > (h + reload_distance)) { 
     print("load more rows") 
    } 
} 

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

Кроме того, глядя на ваш код, вам, вероятно, нужно позвонить на dispatch_async, когда вы пытаетесь обновить интерфейс в фоновом блоке, например.

dispatch_async(dispatch_get_main_queue()) {() -> Void in 
     self.tableview.reloadData() 
    } 



Редактировать
Чтобы загрузить больше результатов от Parse

let query = PFQuery(className: "allPosts") 

query.whereKey("userId", equalTo: (PFUser.currentUser()?.objectId)!) 
query.orderByDescending("createdAt") 

query.limit = 50 // or your choice of how many to download at a time (defaults to 100) 
query.skip = 50 // This will skip the first 50 results and return the next limit after. If 

query.makeRequest...... 



В обработчике завершения, убедитесь, что вы добавить результаты в целом datasourc e (в вашем случае texts) и перегрузите данные.

+0

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

+0

@ H.Lamb Я отредактировал свой ответ, одним словом, вы можете использовать 'query.limit' для установки количества результатов, которые хотите получить, и' query.skip' для получения следующих элементов z после первого набора. – Ollie

+0

спасибо! точно, что мне нужно –

0

Как насчет отображения только 20 (например) строк и добавить кнопку «Далее» в нижней части экрана в UIToolBar? Когда пользователь нажимает кнопку, вы показываете строку 21-40 и т. Д. И т. Д. Вы также можете добавить кнопку «Предыдущая», чтобы вернуться назад.

- (void)setUpToolbar 
{ 
// add a toolbar with a prev and next button 
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle: @"" 
                     style: UIBarButtonItemStylePlain 
                     target: nil 
                     action: nil]; 

UIBarButtonItem *flexibleItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace 
                       target: nil 
                       action: nil]; 

self.prevButton = [[UIBarButtonItem alloc] initWithTitle: NSLocalizedString(@"Prev", nil) 
                style: UIBarButtonItemStylePlain 
                target: self 
                action: @selector(clickedPrevButton:)]; 

self.nextButton = [[UIBarButtonItem alloc] initWithTitle: NSLocalizedString(@"Next", nil) 
                style: UIBarButtonItemStylePlain 
                target: self 
                action: @selector(clickedNextButton:)]; 

self.nextButton.enabled = NO; 
self.prevButton.enabled = NO; 
self.page = 1; 

self.toolbarItems = @[self.prevButton, flexibleItem, self.nextButton]; 
} 

- (void) clickedNextButton: (id) sender 
{  
if ([self.nextButton.title isEqualToString: NSLocalizedString(@"More Results", nil)]) 
{ 
    self.offset += kSearchLimit; 
    self.nextButton.title = NSLocalizedString(@"Next", nil); 
    self.page += 1; 

    [self searchDatabase]; 
} 
else 
{ 
    self.page += 1; 

    if ((self.page - 1) * kEntriesToDisplay > self.searchResults.count) 
    { 
     self.nextButton.enabled = NO; 
    } 

    if (self.page * kEntriesToDisplay == self.searchResults.count) 
    { 
     self.nextButton.enabled = YES; 
     self.nextButton.title = NSLocalizedString(@"More Results", nil); 
    } 

    self.prevButton.enabled = YES; 

    [self updateSearchUI];   
} 
} 

- (void) clickedPrevButton: (id) sender 
{ 
self.page -= 1; 

if (self.page == 1) 
    self.prevButton.enabled = NO; 

self.nextButton.title = NSLocalizedString(@"Next", nil); 
self.nextButton.enabled = YES; 

[self updateSearchUI]; 
} 
+0

это тоже похоже на план. как я должен добиваться этого? –

+0

Я добавил пример кода, который я использую в проекте. Извините, он находится в 'ObjectiveC', но, надеюсь, вы можете использовать его в качестве отправной точки. – Koen

+0

спасибо! попытается быстро воплотить эту идею –

0

Это правильный способ справиться с load more в UITableView. Чтобы избежать флуктуации, под методом, вызываемым при просмотре прокрутки, останавливается.

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { 
    let offsetY = scrollView.contentOffset.y 
    let scrollHeight = scrollView.frame.size.height 

    let endScrolling = offsetY + scrollHeight 

    if endScrolling >= scrollView.contentSize.height { 
     //Load more logic 
    } 
}