IOS 24 实现歌单详情(UITableView)列表

ops/2024/9/23 18:15:18/

歌单详情完整效果

歌单详情歌单列表效果

歌单详情列表页整体效果稍微有点复杂,我们进行分部实现,先实现歌单详情里面的歌单列表,使用UITableView来实现。UITableView的使用在之前的文章中多次使用,想来也比较熟悉了。不熟悉的可以看之前文章:IOS 21 发现界面(UITableView)单曲列表(UITableView)实现

歌单列表UITableView实现

1、创建SheetDetailController,继承自BaseTitleController

class SheetDetailController: BaseTitleController {
}

2、重新initViews(),初始化 UITableView

class SheetDetailController: BaseTitleController {override func initViews() {super.initViews()// 初始化TableView结构initTableViewSafeArea()}}

歌单列表Cell实现

实现流程:
1.创建Cell,及在使用UITableView的Controller控制器上注册Cell;

2.获取data列表数据,并调用UITableView的reloadData(),将数据更新到列表;

3.将data的Item数据绑定UITableView的每一个Cell。

1)创建和注册Cell

从效果图上面可以看出,歌单列表Cell由一个水平方向布局包含左中右三部分来实现。

自定义SongItemCell,继承自BaseTableViewCell,默认就是一个水平方向的TGLinearLayout。

//
//  SongItemCell.swift
//  音乐cell
//
//  Created by jin on 2024/9/12.
//import UIKit
import TangramKitclass SongItemCell: BaseTableViewCell {override func initViews() {super.initViews()container.tg_space = 0container.backgroundColor = .colorLightWhite//右侧有边距container.tg_padding = UIEdgeInsets(top: PADDING_SMALL, left: 0, bottom: 0, right: PADDING_SMALL)container.tg_gravity = TGGravity.vert.center//左侧容器let leftContainer = TGRelativeLayout()leftContainer.tg_width.equal(50)leftContainer.tg_height.equal(50)container.addSubview(leftContainer)//索引leftContainer.addSubview(self.indexView)//右侧容器let rightContainer = TGLinearLayout(.vert)rightContainer.tg_width.equal(.fill)rightContainer.tg_height.equal(.wrap)rightContainer.tg_space = PADDING_SMALLcontainer.addSubview(rightContainer)//标题rightContainer.addSubview(self.titleView)//信息容器let infoContainer = TGLinearLayout(.horz)infoContainer.tg_width.equal(.fill)infoContainer.tg_height.equal(.wrap)infoContainer.tg_space = PADDING_SMALLrightContainer.addSubview(infoContainer)infoContainer.addSubview(self.downloadedView)infoContainer.addSubview(self.infoView)//更多按钮let moreButton = ViewFactoryUtil.button(image:R.image.moreVerticalDot()!.withTintColor())moreButton.tintColor = .black80moreButton.tg_width.equal(50)moreButton.tg_height.equal(50)container.addSubview(moreButton)}func bind(_ data:Song) {titleView.text = data.titleinfoView.text = "\(data.singer.nickname!) - 这是专辑"}lazy var indexView: UILabel = {let result = UILabel()result.tg_width.equal(.wrap)result.tg_height.equal(.wrap)result.tg_centerX.equal(0)result.tg_centerY.equal(0)result.numberOfLines = 1result.font = UIFont.systemFont(ofSize: TEXT_LARGE)result.textColor = .black80return result}()lazy var titleView: UILabel = {let r = UILabel()r.tg_width.equal(.fill)r.tg_height.equal(.wrap)r.numberOfLines = 1r.font = UIFont.systemFont(ofSize: TEXT_LARGE)r.textColor = .colorOnSurfacereturn r}()lazy var downloadedView: UIImageView = {let r = UIImageView()r.tg_width.equal(.wrap)r.tg_height.equal(.wrap)r.tg_visibility = .goner.image = R.image.downloaded()return r}()lazy var infoView: UILabel = {let r = UILabel()r.tg_width.equal(.fill)r.tg_height.equal(.wrap)r.numberOfLines = 1r.font = UIFont.systemFont(ofSize: TEXT_MEDDLE)r.textColor = .black80return r}()
}
//
//  BaseTableViewCell.swift
//  通用TableViewCell
//
//  Created by jin on 2024/8/27.
//import UIKit//提供类似Android中更高层级布局框架
import TangramKitclass BaseTableViewCell:UITableViewCell{//对于需要动态评估高度的UITableViewCell来说可以把布局视图暴露出来。用于高度评估和边界线处理。以及事件处理的设置。var container:TGBaseLayout!override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {super.init(style: style, reuseIdentifier: reuseIdentifier)innerInit()}required init?(coder: NSCoder) {super.init(coder: coder)innerInit()}func innerInit() {initViews()initDatum()initListeners()}/// 找控件func initViews() {//背景透明backgroundColor = .clearcontentView.backgroundColor = .clear//去掉默认的选中颜色selectionStyle = .none//根容器container = TGLinearLayout(getContainerOrientation())container.tg_width.equal(.fill)container.tg_height.equal(.wrap)container.tg_space = PADDING_MEDDLEcontentView.addSubview(container)}func initDatum() {}func initListeners() {}/// 获取根容器布局方向func getContainerOrientation() -> TGOrientation {return .horz}/// 使用TangramKit后,让item自动计算高度,要重写该方法/// - Parameters:///   - targetSize: <#targetSize description#>///   - horizontalFittingPriority: <#horizontalFittingPriority description#>///   - verticalFittingPriority: <#verticalFittingPriority description#>/// - Returns: <#description#>override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {return self.container.systemLayoutSizeFitting(targetSize)}
}

在SheetDetailController控制器,注册SongItemCell

class SheetDetailController: BaseTitleController {override func initViews() {super.initViews()// 初始化TableView结构initTableViewSafeArea()// 注册单曲tableView.register(SongItemCell.self, forCellReuseIdentifier: Constant.CELL)}}
2)获取data列表数据

定义列表数据模型Song

//
//  Song.swift
//  单曲模型
//
//  Created by jin on 2024/9/2.
//import Foundation//导入JSON解析框架
import HandyJSONclass Song : BaseCommon{/// 标题var title:String!/// 封面var icon:String?/// 音乐地址var uri:String!/// 点击数var clicksCount:Int = 0/// 评论数var commentsCount:Int = 0/// 创建该音乐的人var user:User!/// 歌手var singer:User!/// 歌词类型var style:Int = 0/*** 歌词内容*/var lyric:String? = niloverride func mapping(mapper: HelpingMapper) {super.mapping(mapper: mapper)mapper <<< self.clicksCount <-- "clicks_count"mapper <<< self.commentsCount <-- "comments_count"}
}

请求歌单详情接口获取歌单详情里的歌曲列表数据,更新tableView.reloadData()

class SheetDetailController: BaseTitleController {var id: String!var data: Sheet!override func initViews() {super.initViews()// 初始化TableView结构initTableViewSafeArea()title = R.string.localizable.sheet()// 注册单曲tableView.register(SongItemCell.self, forCellReuseIdentifier: Constant.CELL)}override func initDatum() {super.initDatum()loadData()}func loadData() {DefaultRepository.shared.sheetDetail(id).subscribeSuccess { [weak self] data inself?.show(data.data!)}.disposed(by: rx.disposeBag)}func show(_ data: Sheet) {self.data = datadatum = data.songs ?? []tableView.reloadData()}
}
3)Item数据绑定Cell

SheetDetailController控制器重写父类的扩展 cellForRowAt方法,创建对应的Cell,并将Item数据绑定到Cell。

extension SheetDetailController {override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {let data = datum[indexPath.row] as! Songlet cell = tableView.dequeueReusableCell(withIdentifier: Constant.CELL, for: indexPath) as! SongItemCellcell.bind(data)cell.indexView.text = "\(indexPath.row + 1)"return cell}
}

至此,实现了歌单详情里面的歌单列表。


http://www.ppmy.cn/ops/114894.html

相关文章

Elasticsearch:一次生产集群 ES Watcher 失效的深度排查与分析 - 全过程剖析与解决方案

作者&#xff1a;尚雷&#xff0c;TechTalk 技术交流社区创办者 一次生产集群 ES Watcher 失效的深度排查与分析 全过程剖析与解决方案​​ 一、Elasticsearch Watcher 介绍 1.1 Watcher 概念概述 Watcher 是 Elasticsearch 提供的一项监控和告警服务&#xff0c;允许用户定义…

北京市朝阳区自闭症寄宿学校:为孩子提供优质照顾与学习环境

北京市朝阳区自闭症寄宿学校的愿景与广州星贝育园的卓越实践 在北京市朝阳区&#xff0c;乃至全国范围内&#xff0c;自闭症儿童的教育与照护一直是社会各界关注的焦点。家长们渴望为孩子找到一所能够提供优质照顾与学习环境的学校&#xff0c;让他们在爱与专业的滋养下茁壮成…

在excel中使用python?

是的&#xff01;excel中可以使用python了&#xff01; 在去年8月22日&#xff0c;微软通过官方博客发布将与anaconda展开合作&#xff0c;简而言之就是excel将支持python&#xff0c;可以在表格中直接利用python就行数据分析&#xff0c;可以在表格中直接运行python了。 如何…

浅谈C#之SynchronizationContext

一、基本介绍 SynchronizationContext是一个抽象类&#xff0c;它提供了一种机制&#xff0c;允许代码与创建它的线程同步。这在UI编程中非常有用&#xff0c;比如在Windows Forms或WPF应用程序中&#xff0c;你可能需要确保某些操作在UI线程上执行&#xff0c;以避免跨线程操作…

深度学习02-pytorch-03-张量的数值计算

张量&#xff08;Tensor&#xff09;是多维数组的通用化概念&#xff0c;它可以表示标量&#xff08;0维&#xff09;、向量&#xff08;1维&#xff09;、矩阵&#xff08;2维&#xff09;以及更高维度的数据。在深度学习和数值计算中&#xff0c;张量是基础数据结构&#xff…

Redis中Hash(哈希)类型的基本操作

文章目录 一、 哈希简介二、常用命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloathstrlen 三、命令小结四、哈希内部编码方式五、典型应用场景六、 字符串&#xff0c;序列化&#xff0c;哈希对比 一、 哈希简介 几乎所有的主流编程语言都提供了哈…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案&#xff08;如何主动屏蔽报错&#xff09; 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

快递物流单号识别API接口DEMO下载

单号识别API为用户提供单号识别快递公司服务&#xff0c;依托于快递鸟大数据平台&#xff0c;用户提供快递单号&#xff0c;即可实时返回可能的一个或多个快递公司&#xff0c;存在多个快递公司结果的&#xff0c;大数据平台根据可能性、单号量&#xff0c;进行智能排序。 应用…