类型' UITableViewCell'的价值没有会员

时间:2017-07-30 15:47:28

标签: ios swift uitableview

我想创建一个cell变量并指定dequeueReusableCell以避免重复代码。我不知道我该怎么做。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell : UITableViewCell!
        if let url = media.url {
            if Helper.isImageType(url: url)
            {
                cell = tableView.dequeueReusableCell(withIdentifier: newsFeedImageTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell
                cell.imageTappedDelegate = self
            }else
            {
                cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell
                cell.videoTappedDelegate = self
            }
            cell.linkTappedDelegate  = self
            cell.backgroundColor = UIColor(rgb: 0xF2F2F2)
            cell.isAccessibilityElement = true
            cell.selectionStyle = .none
            tableViewIndex = indexPath
            if let  _states = states?[indexPath.section]{
                cell.state = _states[indexPath.row]
            }
            return cell
        }
    return UITableViewCell()
}

如果你看到我的代码只是差异

let cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell 

并且

let cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell

其他代码行相同。

我正在尝试声明变量,但它不起作用:

let cell: UITableViewCell!
  

类型的价值' UITableViewCell'没有会员' imageTappedDelegate'

更新: - 添加了单元格类定义:

class NewsFeedTableViewViewCell : BaseTableViewCell{  
    var statisticsSlidingCellId = "statisticsSlidingCellId"
    var linkTappedDelegate : LinkTappedDelegate!
    var state : State?{
        didSet{
          }
    }
}

class   NewsFeedImageTableViewViewCell: NewsFeedTableViewViewCell{
    var imageTappedDelegate : ImageTappedDelegate!
}

class   NewsFeedVideoTableViewViewCell : NewsFeedTableViewViewCell{
    var videoTappedDelegate : VideoTappedDelegate!
}

2 个答案:

答案 0 :(得分:2)

要解决您的问题,请在分配代理之前转换为正确的类型。每当引用单元格时,它的类型为UITableViewCell,因此自定义子类上的属性/方法不存在。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell : NewsFeedTableViewViewCell!
        if let url = media.url {
            if Helper.isImageType(url: url)
            {
                cell = tableView.dequeueReusableCell(withIdentifier: newsFeedImageTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell
                (cell as ! NewsFeedImageTableViewCell).imageTappedDelegate = self
            }else
            {
                cell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell
                (cell as! NewsFeedVideoTableViewCell).videoTappedDelegate = self
            }
            cell.linkTappedDelegate  = self
            cell.backgroundColor = UIColor(rgb: 0xF2F2F2)
            cell.isAccessibilityElement = true
            cell.selectionStyle = .none
            tableViewIndex = indexPath
            if let  _states = states?[indexPath.section]{
                cell.state = _states[indexPath.row]
            }
            return cell
        }
    return UITableViewCell()
}

答案 1 :(得分:1)

这个答案非常接近Josh Hamet的,所以,我补充了一些评论。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if let url = media.url {
        let cell: NewsFeedTableViewViewCell //<- common class
        if Helper.isImageType(url: url) {
            let imageCell = tableView.dequeueReusableCell(withIdentifier: newsFeedImageTableViewViewCellId, for: indexPath) as! NewsFeedImageTableViewViewCell
            //When accessing `imageTappedDelegate`, the type of the cell needs to be `NewsFeedImageTableViewViewCell`.
            imageCell.imageTappedDelegate = self
            cell = imageCell
        } else {
            let videoCell = tableView.dequeueReusableCell(withIdentifier: newsFeedVideoTableViewViewCellId, for: indexPath) as! NewsFeedVideoTableViewViewCell
            //When accessing `videoTappedDelegate`, the type of the cell needs to be `NewsFeedVideoTableViewViewCell`.
            videoCell.videoTappedDelegate = self
            cell = videoCell
        }
        //When accessing common properties, the type of the cell can be `NewsFeedTableViewViewCell`.
        cell.linkTappedDelegate  = self
        cell.backgroundColor = UIColor(rgb: 0xF2F2F2)
        cell.isAccessibilityElement = true
        cell.selectionStyle = .none
        tableViewIndex = indexPath
        if let  _states = states?[indexPath.section]{
            cell.state = _states[indexPath.row]
        }
        return cell
    }
    return UITableViewCell()
}