#ios #swift #facebook #web-services #uitableview
#iOS #swift #Facebook #веб-сервисы #uitableview
Вопрос:
Я использую UITableView для загрузки данных из веб-службы. Когда загружается ячейка viewDidLoad 10, при прокрутке пользователем вниз загружается больше данных, как в приложении Facebook.
Проблема в том, что при загрузке должно быть загружено более 10 дополнительных ячеек (numberOfRowInSection должно быть равно 20), но вместо этого повторяются первые 10 ячеек, а затем появляется новостная ячейка (т. Е. numberOfRowInSection равно 30)
пример того, что происходит
viewDidLoad:
A
B
C
при загрузке большего:
A
B
C
A
B
C
D
E
F
чего я ожидаю, так это :
viewDidLoad:
A
B
C
при загрузке большего:
A
B
C
D
E
F
Я получаю данные из веб-службы в этом коде:
if let infoDic = result.valueForKey("Info") as? NSDictionary {
globalVariables.gcurrentRun = (infoDic["CurrentRun"] as! String)
print("currentRun: (globalVariables.gcurrentRun)")
globalVariables.gnextRun = (infoDic["NextRun"] as? String)!
if globalVariables.gcurrentRun == "1" {
sourceForImage = "news_icn"
}
else if globalVariables.gcurrentRun == "2" {
sourceForImage = "facebook_icon"
}
else if globalVariables.gcurrentRun == "3" {
sourceForImage = "twitter_icn"
}
print("nextRun: (globalVariables.gnextRun)")
currentRunForLoadMore = globalVariables.gnextRun
if "(infoDic["NoData"])" == 1 {
globalVariables.gnoData = "noMoreData"
print("noData: (globalVariables.gnoData)")
} else {
globalVariables.gnoData = "moreData"
print("noData: (globalVariables.gnoData)")
}
globalVariables.gpreviousRun = (infoDic["PreviousRun"] as? String)!
print("previousRun: (globalVariables.gpreviousRun)")
currentRunForRefresh = globalVariables.gpreviousRun
globalVariables.gremark = (infoDic["Remark"] as? String)!
print("remark: (globalVariables.gremark)")
}
if let mediaArray = result.valueForKey("mediaList") as? NSArray {
for media in mediaArray {
if globalVariables.gcurrentRun == "1" {
channel = ((media as? NSDictionary)!.valueForKey("Channel") as? String)!
print("channel: (channel)")
}
globalVariables.gContentOfNews = ((media as? NSDictionary)!.valueForKey("Content") as? String)!
print("content: (globalVariables.gContentOfNews)")
if globalVariables.gcurrentRun != "1" {
if let memberDic = (media.valueForKey("member") as? NSDictionary){
let memberFName = memberDic.valueForKey("Member_FName") as! String
channel = memberFName
}
print("fromName: (channel)")
}
globalVariables.gIdFromWeb = Int((media.valueForKey("ID") as? String)!)!
globalVariables.gPublishD = ((media as? NSDictionary)!.valueForKey("PublishD") as? String)!
print("publishD: (globalVariables.gPublishD)")
globalVariables.gPublishT = ((media as? NSDictionary)!.valueForKey("PublishT") as? String)!
print("publishTime: (globalVariables.gPublishT)")
newsGrouped.append(NewsGrouped(channelOfNews: channel, publishedDate: globalVariables.gPublishD, publishedTime: globalVariables.gPublishT, contentOfNews: globalVariables.gContentOfNews, remarkSourceOfNews: "(globalVariables.gTypeId)", newsIdFromWeb: globalVariables.gIdFromWeb, noDataToShow: globalVariables.gnoData))
do {
let bosId = try TeamDataHelper.insert(
NewsFeed(
newsId: 0,
typeId: Int(globalVariables.gcurrentRun)!,
idFromWeb: globalVariables.gIdFromWeb,
newInsertFlag: 1,
channel: channel,
fromName: globalVariables.gFromName,
contentOfNews: globalVariables.gContentOfNews,
publishD: globalVariables.gPublishD,
publishT: globalVariables.gPublishT
))
print(bosId)
}
}
completion(newsGrouped: newsGrouped)
}
Здесь я использую код с функциями UITableView:
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
print("numberOfRows: (newsGrouped.count)")
return self.newsGrouped.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
loadActivityIndicator.stopAnimating()
let newsCell: HPNewsWithImageTableViewCell = newsTableView.dequeueReusableCellWithIdentifier("hpNewsWithImageTableViewCell", forIndexPath: indexPath) as! HPNewsWithImageTableViewCell
newsCell.idLbl.text = "(newsGrouped[indexPath.section].newsIdFromWeb)"
print("newsIdFromWeb: (newsGrouped[indexPath.section].newsIdFromWeb)")
newsCell.newsDate.text = newsGrouped[indexPath.section].publishedDate
newsCell.userNameLbl.text = newsGrouped[indexPath.section].channelOfNews
print("globalVariables.gChannel: (newsGrouped[indexPath.section].channelOfNews)")
newsCell.imageOfSource.image = UIImage(named: "(newsGrouped[indexPath.section].sourceImage)")
print("imageOfSource: (newsGrouped[indexPath.section].sourceImage)")
newsCell.newsTime.text = newsGrouped[indexPath.section].publishedTime
print(newsGrouped[indexPath.section].publishedTime)
newsCell.newsText.text = newsGrouped[indexPath.section].contentOfNews
print(newsGrouped[indexPath.section].contentOfNews)
newsCell.selectionStyle = .None
do {
try TeamDataHelper.update()
}
catch {
}
return newsCell
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 170
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("newsDetailsSegue", sender: self)
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 1.5
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 5
}
func scrollViewDidScroll(scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
let contentHeight = scrollView.contentSize.height
if offsetY > contentHeight - scrollView.frame.size.height {
loadMoreIndicator.hidden = false
loadMoreIndicator.startAnimating()
CallForNewsAPICalls.GetNewsFeeds(actionDown, CurrentRun: currentRunForLoadMore) { (newsGrouped) -> Void in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
for news in newsGrouped {
print("currentRunForLoadMore(currentRunForLoadMore)")
self.newsGrouped.append(news)
}
self.newsTableView.reloadData()
})
}
}
}
обратите внимание, что я использую локальные данные
Заранее спасибо
Комментарии:
1. можете ли вы показать некоторые фрагменты кода? Я думаю, что у вас что-то не так при добавлении данных в ваш массив…
2. Каков вывод этой строки:
print("numberOfRows: (newsGrouped.count)")
после второго запроса?3. при просмотре didLoad: numberOfRows: 10 когда я загружаю больше данных: numberOfRows: 30, это происходит автоматически без дополнительной загрузки numberOfRows: 60 и продолжается до тех пор, пока не достигнет numberOfRows: 4772 @MaxPevsner
4. Один из способов, который вы можете использовать, например, перед добавлением данных в массив, удалите все объекты, а затем добавьте ответ.
Ответ №1:
Похоже, что ваш сервер возвращает вам все данные.
Перед добавлением новых данных
newsGrouped.append(NewsGrouped(channelOfNews: channel, publishedDate: globalVariables.gPublishD, publishedTime: globalVariables.gPublishT, contentOfNews: globalVariables.gContentOfNews, remarkSourceOfNews: "(globalVariables.gTypeId)", newsIdFromWeb: globalVariables.gIdFromWeb, noDataToShow: globalVariables.gnoData))
очистите newsGrouped
массив.
Комментарии:
1. Я попробовал ваше предложение, но у меня есть пустая таблица.
2. о, я заметил кое-что, что следующие 10 ячеек после первой загрузки пропускаются вместе с остальными 10 ячейками. первая после новых 10 ячеек повторяется 3 раза
3. также данные не установлены по порядку
4. @R.AlAli поставьте точку останова в строке, упомянутой в моем ответе, и проверьте, какие значения
newsGrouped
имеют каждый раз, когда она попадает.5. Спасибо, что очистка массива групп новостей — это решение
Ответ №2:
Чтобы убедиться, что вы загружаете только последнюю строку, вы можете использовать willDisplayCell
. Проверьте, равна ли текущая строка общему количеству или массиву, затем начните загружать новые данные
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if indexPath.row == self.yourArray.count - 1 {
// fetch your data here
}
}
Ответ №3:
Вы просто сохраняете предыдущие данные в одном массиве, например, в storeArray, и когда вы загружаете другие, добавляете их в storeArray и используете sotreArray в tableview …