ios - UITableView:滚动加载更多 Youtube 项目

标签 ios swift uitableview scroll youtube-api

我正在从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 ...")
    }
}
  1. 如何在我获取 token 时使用 ViewController 中的 pageToken 来自 VideoModel 类?
  2. 如何自动增加“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/

    相关文章:

    ios - UIPickerView 依赖于 UITableView

    ios - 强制标签文本从左到右,同时包含一些从右到左的文本

    ios - 在不影响取消按钮的情况下关闭 UISearchBar 键盘

    swift - 将自定义类 SKSpriteNode 加载到 SKScene 时应用程序崩溃

    arrays - Swift 中的 TableView 搜索

    ios - 从数组中的数组访问对象(在模型类中定义)

    ios - 在 UIPageViewController 中使用 UISlider

    ios - iBeacons 在 iOS 10.0.2 中损坏?

    ios - 如何在一行中没有键的情况下检查字典数组中的值

    ios - 使用导航 Controller 时滞后 UITableView 滚动