我正在为 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。
我正在构建的应用永远不会成为生产应用,它是概念验证和学习练习。我通常不会在这里提问,因为我很擅长使用该网站来查找我需要的答案,但我对这个问题感到困惑。
最佳答案
您似乎没有分配您的委托(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/