我正在从Youtube channel 获取视频,当APP启动时我可以显示10个视频。
我想使用以下技巧(使用 pagetoken ; Retrieve all videos from youtube playlist using youtube v3 API )来显示更多视频。
这个想法是通过使用 willDisplayCell 方法向下滚动以获取下一个视频。
ViewController:
override func viewDidLoad() {
super.viewDidLoad()
self.model.delegate = self
model.getFeedVideo()
self.tableView.dataSource = self
self.tableView.delegate = self
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
if !loadingData && indexPath.row == 10 - 1 {
model.getFeedVideo()
print("loading more ...")
}
}
- 如何在我获取 token 时使用 ViewController 中的 pageToken 来自 VideoModel 类?
- 如何自动增加“10” 索引路径属性?是否可以获取当前显示的数量 细胞?
视频模型:
protocol VideoModelDelegate {
func dataReady()
}
class VideoModel: NSObject {
func getFeedVideo() {
var nextToken:String
nextToken = "XXXXXX"
// Fetch the videos dynamically via the Youtube Data API
Alamofire.request(.GET, "https://www.googleapis.com/youtube/v3/playlistItems", parameters: ["part":"snippet", "playlistId":PLAYLIST_ID, "key":API_KEY, "maxResults":10, "pageToken":nextToken], encoding: ParameterEncoding.URL, headers: nil).responseJSON { (response) -> Void in
if let JSON = response.result.value {
nextToken = JSON["nextPageToken"] as! String
print(nextToken)
var arrayOfVideos = [Video]()
for video in JSON["items"] as! NSArray {
// Creating video object...
// Removed to make it clearer
}
self.videoArray = arrayOfVideos
if self.delegate != nil {
self.delegate?.dataReady()
}
}
}
}
- 我需要添加返回值还是应该创建另一个方法来获取 pageToken?请提出建议。
最佳答案
我将为您提供如何实现它的总体思路。
第一:使用 if !loadingData && indexPath.row == self.videos.count - 1 检查用户是否滚动到最后一个元素
第二个(编辑):
//VideoModel.swift
if self.delegate != nil {
//Pass fetched videos and token to the delegate method.
self.delegate?.dataReady(self.videoArray, nextToken)
}
现在,委托(delegate)方法发生了一些变化:
//ViewController.swift
func dataReady(Array->Videos,String->Token) {
//Define a variable globally and assign received token for later use
tokenGlobal = Token
//add received array of videos to the current array of videos
[self.videos addObjectsFromArray:Videos];
//Here are two options to populate new videos,
//First, Reload whole table view, not a recommended approach, since it will take much more time to load
self.tableView.reloadData()
//Second, add cells to the existing tableView, instead of loading whole table it will added new cells according to the newly added videos into the array.
}
现在,当用户到达 tableView 的末尾时,传递我们保存在全局变量中的 token ,如下所示:
if !loadingData && indexPath.row == self.videos - 1 {
model.getFeedVideo(tokenGlobal)
print("loading more ...")
}
现在,使用此 tokenGlobal
通过“getFeedVideo”方法获取更多视频。
查找 SO 以了解如何向 TableView 添加新单元格。但为了进行测试,您可以继续使用 reloadData
。
P.S:我不知道 Swift 语法。 :)
关于ios - UITableView:滚动加载更多 Youtube 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503172/