我想创建一个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!
}
答案 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()
}