ios - 委托(delegate)有问题,我的委托(delegate)总是零,tvOS,swift 2.0

标签 ios swift delegates uicollectionview tvos

我正在为 tvOS 开发一个 netflix 风格的应用程序,我已经遵循了一些教程,并且已经完成了我的 stackOverflow 研究。这非常有帮助,这实际上是我找到我正在尝试实现的委托(delegate)解决方案的方式。对于我现在遇到的问题,我在这里找到的大部分内容都引用了不同的弹出 View 或容器。这不完全是我的问题,所以我很难过。一般来说,我也非常喜欢新的 iOS、tvOS、Swift,我之前的大部分开发工作是 JS、AS3、经典 ASP、PHP...

重点:我有一个 View 结构,如图所示:view structure

我有一个主 ViewController 类,名为 ListViewController, 我的 TableView 单元格有一个名为 ListTableViewCell 的类,引用是“rowCell”,如图所示。 我有一个名为 ListViewCell 的 Collection View 单元格调用。

我的 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)

    }



}

委托(delegate)始终为零。

这是我的 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

最佳答案

您似乎没有分配您的委托(delegate):

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
}

关于ios - 委托(delegate)有问题,我的委托(delegate)总是零,tvOS,swift 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751149/

相关文章:

swift - 将方向应用于 CGContext

ios - TableView 没有出现在模拟器中?

.net - 将委托(delegate)包装在 IEqualityComparer 中

.net - CLR 是否知道有关事件的任何信息?

iphone - 如何为从一个 Controller 到另一个 Controller 的webview创建对象

ios - 如何在 iOS Swift 中实现 Firebase Microsoft OAuth?

objective-c - 如何将 UIView 放在键盘上方

ios - 以编程方式创建通用矢量图像

swift - 调整 UITextView 大小问题

ios - 在 MVVM 中设置委托(delegate)的正确方法