如何解决具有广告元素的iOS TableView-IndexPath.row逻辑
我希望在0索引处以及此后每三个单元格之后添加一个广告单元格。我成功添加了第一个,但是不确定如何实现。
两个广告都只拍摄一张图片。
我当前的代码如下:
var adCount = 1
var newsTitleArray : [String] = ["News1"]
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return newsTitleArray.count + adCount
}
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "BannerTableViewCell") as! BannerTableViewCell
cell.adImageView.image = UIImage(named:"Logo")
NewsTableView.rowHeight = 50
return cell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: "NewsTableViewCell") as! NewsTableViewCell
cell.newsTitle.text = newsTitleArray[indexPath.row - 1]
cell.newsSubTitle.text = newsSubTitleArray[indexPath.row - 1]
cell.newsDate.text = newsDateArray[indexPath.row - 1]
cell.newsImageView.image = UIImage(named: randomPicArray[indexPath.row - 1])
cell.selectionStyle = .none
NewsTableView.rowHeight = 500
return cell
}
}
解决方法
检查索引以显示特定内容是不好的做法。使用所需的类型更新数据源。在这种情况下,请使用包含News&Ads对象的dataSource而不是newsTitleArray。
enum ContentType {
case news
case ad
}
struct NewsContent {
let type: ContentType = .news
let title: String
//More if needed
}
struct AdContent {
let type: ContentType = .ad
let title: String
//More if needed
}
let dataSource = [AdContent,NewsContent,AdContent,...]
您可以使用此框架创建多个内容类型。这也简化了您访问数据的方式。就像在numberOfRowsInSection
中一样,您无需执行newsContent + ad
,只需返回dataSource.count
。这种方法易于阅读和维护。
func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return dataSource.count
}
func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
let content = dataSource[indexPath.row]
let height: CGFloat?
switch content.type {
case .news:
height = 500
case .ad:
height = 50
}
return height ?? 500 // return default
}
现在根据内容类型返回/更新单元格
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let content = dataSource[indexPath.row]
let cell: UITableViewCell?
switch content.type {
case .news:
cell = tableView.dequeueReusableCell(withIdentifier: "NewsTableViewCell") as? NewsTableViewCell
cell?.newsTitle.text = newsTitleArray[indexPath.row - 1]
cell?.newsSubTitle.text = newsSubTitleArray[indexPath.row - 1]
cell?.newsDate.text = newsDateArray[indexPath.row - 1]
cell?.newsImageView.image = UIImage(named: randomPicArray[indexPath.row - 1])
cell?.selectionStyle = .none
case .ad:
cell = tableView.dequeueReusableCell(withIdentifier: "BannerTableViewCell") as? BannerTableViewCell
cell?.adImageView.image = UIImage(named:"Logo")
}
return cell ?? UITableViewCell()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。