代表团遇到麻烦,我的代表总是零,tvOS,swift 2.0

时间:2016-06-10 14:46:30

标签: ios swift delegates uicollectionview tvos

我正在研究tvOS的netflix风格的应用程序,我已经学习了一些教程,并完成了我对stackOverflow研究的分享。这是非常有帮助的,实际上我是如何找到我试图实现的委托解决方案的。由于我现在遇到的问题,我在这里发现的大部分内容都引用了不同的弹出视图或容器。这不是我的问题,所以我很难过。我也非常喜欢新的iOS,tvOS,Swift品牌,我之前的大部分开发工作都是JS,AS3,经典ASP,PHP ......

重点:我有一个如下所示的视图结构:view structure

我的主ViewController有一个类,叫做ListViewController, 我有一个名为ListTableViewCell的表视图单元的类,如图所示,引用是“rowCell”。 我有一个名为ListViewCell的集合视图单元格的调用。

我的ListTableViewCell的结构如下:

import UIKit

protocol ListViewDelegate {
    func updatePreview (name: String,runtTime:Int,description:String,level:String)
}

class ListTableViewCell: UITableViewCell{
    var delegate:ListViewDelegate?
    var list:List?

    @IBOutlet weak var collectionView: UICollectionView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

extension ListTableViewCell : UICollectionViewDataSource { 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if (self.list?.MediaObjects.count != nil){
            return (self.list?.MediaObjects.count)!
        }else{
               return 0
        }

    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("videoCell", forIndexPath: indexPath) as! ListViewCell
            let list = self.list!
            let media = list.MediaObjects
            cell.mediaLabel.text = media[indexPath.row].name
        return cell
    }


    func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {


    }

    override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool {
        let list = self.list!
        let cell: UICollectionViewCell = context.nextFocusedView as! UICollectionViewCell
        let indexPath: NSIndexPath? = self.collectionView.indexPathForCell(cell)
        if  let path = indexPath{
            let name =  list.MediaObjects[path.row].name
            let runTime = list.MediaObjects[path.row].runTime
            let description = list.MediaObjects[path.row].description
            let level = list.MediaObjects[path.row].level
            print(path.row)
            if let del = delegate {
                del.updatePreview(name,runtTime:runTime,description:description,level:level)
            }
        }

        return true
    }



    func collectionView(collectionView: UICollectionView, shouldHighlightItemAtIndexPath indexPath: NSIndexPath) -> Bool {

        return true
    }



    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

        let playerVC = PlayerViewController()
        playerVC.videoFile = (list?.MediaObjects[indexPath.row].fileURI)!
        playerVC.playVideo()
        UIApplication.sharedApplication().keyWindow?.rootViewController?.presentViewController(playerVC, animated: true, completion: nil)

    }



}

代表总是零。

这是我的UIViewController类的代码 -

import UIKit

class ListViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, ListViewDelegate {
    @IBOutlet weak var tableView: UITableView!

    var lists = [List]()

    @IBOutlet weak var videoDescriptionLabel: UILabel!
    @IBOutlet weak var videoLevelLabel: UILabel!
    @IBOutlet weak var videoRunTimeLabel: UILabel!
    @IBOutlet weak var videoTitleLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        let listLoader = loadLists()
        listLoader.loadData { (dataLoaded:Bool, lists:[List]) in
            if (dataLoaded == true){
                    print("complete \(self.lists.count)")
                    self.lists = lists
                    self.tableView.reloadData()
            }else {
                print("data load error")
            }

        }

        self.tableView.dataSource = self
        self.tableView.delegate = self



        // Do any additional setup after loading the view.
    }




    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return self.lists.count
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return 1
    }

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        let row = self.lists[section]
        return "\(row.name)"
    }

    func tableView(tableView: UITableView, canFocusRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("rowCell") as! ListTableViewCell
        let list = self.lists[indexPath.row]
        cell.list = list

        return cell
    }

    func updatePreview(name: String,runtTime:Int,description:String,level:String) {
        print("delegage method called")
        self.videoLevelLabel.text = level
        self.videoTitleLabel.text = name
        self.videoDescriptionLabel.text = description
        self.videoRunTimeLabel.text = String(runtTime)


    }





}

这段代码还没有准备就绪,我知道,没有必要评论我如何处理选项等等......我已经完全清楚我需要清理的其他问题。任何关于代码结构或更好的方法的反馈或只是“你这样做都是错的”将不胜感激,但请继续评论主题。我的代码工作,我从我自己的Parse Server实例中提取数据,我可以浏览播放列表和视频,并以编程方式调用播放器,他们将播放。我唯一遇到的问题是将数据冒泡回VC,以便我可以更新相应的Outlets。

我正在构建的应用程序永远不会是一个生产应用程序,它是一个概念证明和学习练习。我一般不会在这里提问,因为我很擅长使用网站找到我需要的答案,但我很难接受这个问题。

The UI Screenshots

3 个答案:

答案 0 :(得分:1)

您好像没有分配您的代表:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("videoCell", forIndexPath: indexPath) as! ListViewCell
        let list = self.list!
        let media = list.MediaObjects
        cell.mediaLabel.text = media[indexPath.row].name
        cell.delegate = self // set delegate in your cellforItemAtIndexPath method
    return cell
}

答案 1 :(得分:0)

确保设置委托。对于UITableViewController模板,委托&数据源在界面构建器中自动设置。

尝试在接口构建器或代码中设置委托和数据源。

答案 2 :(得分:0)

所以,如果我正确理解了这个问题;你有一个具有tableview的视图控制器。 tableview单元格中有一个collectionview。只要集合视图中有焦点更新,您就希望将回调发送回视图控制器。

您所要做的就是在视图控制器中设置您在 tableview cellForRow方法中创建的委托变量。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ListTableViewCell.self), for: indexPath) as! ListTableViewCell

        cell.delegate = self /// Setting the delegate so that view controller gets the callback for focus update

        return cell
    }