2016-02-18 3 views
0

В настоящее время я пытаюсь создать UITableView, который загружает данные, когда пользователь прокручивает его.Пейджинговые данные в UITableView

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

Проблема заключается в том, что пользователь сможет перейти к середине этого списка через буквы справа. Например, если они нажимают «M», я загружаю 50 записей, начинающихся с «M» в список. Прокрутка вниз будет перемещаться по M и, в конечном счете, к N, O и т. Д.

Конечно, добавление данных в нижней части списка является обычным я и смог сделать это легко. У меня возникли проблемы с поиском справки или если это делается при добавлении 50 записей в верхнюю часть списка по мере прокрутки пользователя.

Например, если пользователь нажимает «М». они должны иметь возможность прокручивать вверх и начинать видеть L's. Я могу добавить данные в начало списка, но проблема заключается в продолжении списка прокрутки.

На данный момент я не могу заставить его работать без перехода из списка или полной остановки.

Может ли кто-нибудь указать мне кого-то, кто сделал это чисто?

+0

Вы собираете записи асинхронно (GCD, NSOperation и т. Д.)? – tktsubota

+0

Получение данных JSON через NSURLSessionDataTask. При захвате данных для добавления в нижней части списка это работает нормально. Таким образом, остановка/прыжок, о которой я говорю, я не думаю, что это операция блокировки. Скорее это от меня, нарушающего предыдущую анимацию прокручиваемого списка и пытающегося разместить его на 50 записей раньше, чем раньше было компенсировать новые данные в начале списка. –

+0

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

ответ

0

ОК, поэтому я понял ответ на свой вопрос. Извините за сообщение, но, возможно, это поможет кому-то другому, потому что я не смог найти точное решение для моего ответа, где, по крайней мере, когда дело дошло до Свифта.

Сначала я загрузил 50 записей, которые начинались с 'M'. Данные JSON вернут номер строки этих записей. Я создал Int-переменные «begin» и «end», которые содержались в диапазоне строк, которые я загрузил в свой массив. Я установил numberOfRowsInSection в «конец» моего диапазона. Это число было значительно больше, чем количество строк, которые я загрузил в свой массив, поэтому мне пришлось окупить, как строки были загружены на основе этого массива. Простой фрагмент кода:

var begin:Int? 
var end:Int = 0 

func onDataLoad() { 
    data = data + DataHandler.data! 
    begin = data[0].Row 
    end = begin! + 50 
    tableView.reloadData() 

    let count = tableView.indexPathsForVisibleRows!.count - 2 
    let indexPath = NSIndexPath(forRow: begin! + count, inSection: 0) 
    tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.None, animated: false) 

    loading = false 
} 

func onBackwardData(evt:Event) { 
    data = DataHandler.data! + data 
    begin = begin! - 50 
    tableView.reloadData() 
    loading = false 
} 

func onForwardData() { 
    end = end + 50 
    data = data + DataHandler.data! 
    tableView.reloadData() 
    loading = false 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return end 
} 

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

    let cell = tableView.dequeueReusableCellWithIdentifier("UserCell", forIndexPath: indexPath) as! PulseListTableViewCell 
    let cellrow = indexPath.row - begin! 
    if cellrow >= 0 { 
     cell.name.text = data[cellrow].Name 
    } 

    return cell 
} 

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    row = indexPath.row 
    let count = tableView.indexPathsForVisibleRows!.count + 5 
    if(indexPath.row >= end - 5 && !loading) 
    { 
     loading = true  
     DataHandler.getUsers(end) 
    } 
    else if(indexPath.row <= begin! + count && begin! > 0 && !loading) 
    { 
     loading = true 
     var offset = begin! - 50 

     if offset < 0 { 
      offset = 0 
     } 

     DataHandler.getUsers(offset) 
    } 
} 

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

Смежные вопросы