Commit 59845980 authored by pete谢兆麟's avatar pete谢兆麟

去除抽屉效果

parent fa1705fd
...@@ -18,23 +18,25 @@ class YHServerHKLifeViewController: YHBaseViewController { ...@@ -18,23 +18,25 @@ class YHServerHKLifeViewController: YHBaseViewController {
var cell: YHServerHKLifeViewCell! var cell: YHServerHKLifeViewCell!
var dataSouce: [YHHomeListModel?] = [] { var dataSouce: [YHHomeListModel?] = [] {
didSet { didSet {
cell.tableFootView.items = dataSouce homeCollectView.reloadData()
} }
} }
var homeTableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .plain) lazy var homeCollectView = {
if #available(iOS 15.0, *) { // 设置布局方向
tableView.sectionHeaderTopPadding = 0 let flowLayout = YHHomeCollectionLayout()
} flowLayout.minimumInteritemSpacing = 7.0
tableView.backgroundColor = .clear flowLayout.minimumColumnSpacing = 7.0
tableView.separatorStyle = .none flowLayout.sectionInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
tableView.showsHorizontalScrollIndicator = false
tableView.showsVerticalScrollIndicator = false let collectinoView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
tableView.rowHeight = UITableView.automaticDimension collectinoView.backgroundColor = .white
tableView.estimatedRowHeight = 81.0 collectinoView.register(YHHomeCollectionViewCell.self, forCellWithReuseIdentifier:YHHomeCollectionViewCell.cellReuseIdentifier)
tableView.bounces = false collectinoView.delegate = self
tableView.register(YHServerHKLifeViewCell.self,forCellReuseIdentifier: YHServerHKLifeViewCell.cellReuseIdentifier) collectinoView.dataSource = self
return tableView collectinoView.translatesAutoresizingMaskIntoConstraints = false
collectinoView.alwaysBounceVertical = true
return collectinoView
}() }()
override func viewDidLoad() { override func viewDidLoad() {
...@@ -46,6 +48,7 @@ class YHServerHKLifeViewController: YHBaseViewController { ...@@ -46,6 +48,7 @@ class YHServerHKLifeViewController: YHBaseViewController {
super.viewWillAppear(animated) super.viewWillAppear(animated)
loadData() loadData()
} }
} }
extension YHServerHKLifeViewController { extension YHServerHKLifeViewController {
...@@ -70,7 +73,7 @@ extension YHServerHKLifeViewController { ...@@ -70,7 +73,7 @@ extension YHServerHKLifeViewController {
guard let self = self else { return } guard let self = self else { return }
self.dataSouce = self.homeViewModel.arrHomeNewsData ?? [] self.dataSouce = self.homeViewModel.arrHomeNewsData ?? []
if self.homeViewModel.hasMoreForHomeNews == false { if self.homeViewModel.hasMoreForHomeNews == false {
self.homeTableView.es.noticeNoMoreData() self.homeCollectView.es.noticeNoMoreData()
} }
} }
} }
...@@ -83,160 +86,114 @@ extension YHServerHKLifeViewController { ...@@ -83,160 +86,114 @@ extension YHServerHKLifeViewController {
gk_navBarAlpha = 0 gk_navBarAlpha = 0
gk_navigationBar.isHidden = true gk_navigationBar.isHidden = true
view.backgroundColor = .white view.backgroundColor = .white
sectionView = { sectionView = {
let view = YHServiceSectionView() let view = YHServiceSectionView()
view.block = {[weak self] model in view.block = {[weak self] model in
guard let self = self else { return } guard let self = self else { return }
self.cell.tableFootView.myCollectView.es.resetNoMoreData() self.homeCollectView.es.resetNoMoreData()
self.cell.tableFootView.myCollectView.setContentOffset(CGPoint.zero, animated: false) if homeCollectView.contentOffset.y > -48 {
self.setScrollState() self.homeCollectView.setContentOffset(CGPoint(x: 0, y: -48), animated: false)
}
self.classId = model.id self.classId = model.id
self.homeViewModel.getList(true, model.id) {[weak self] success, error in self.homeViewModel.getList(true, model.id) {[weak self] success, error in
guard let self = self else { return } guard let self = self else { return }
self.dataSouce = self.homeViewModel.arrHomeNewsData ?? [] self.dataSouce = self.homeViewModel.arrHomeNewsData ?? []
if self.homeViewModel.hasMoreForHomeNews == false { if self.homeViewModel.hasMoreForHomeNews == false {
self.homeTableView.es.noticeNoMoreData() self.homeCollectView.es.noticeNoMoreData()
} }
} }
} }
return view return view
}() }()
tableHeadView = YHServerTableHeadView() view.addSubview(homeCollectView)
tableHeadView.frame = CGRect(x: 0, y: 0, width: KScreenWidth, height: 365) homeCollectView.snp.makeConstraints { make in
view.addSubview(homeTableView)
homeTableView.tableHeaderView = tableHeadView
homeTableView.tableFooterView = tableFootView
homeTableView.snp.makeConstraints { make in
make.top.left.right.equalToSuperview() make.top.left.right.equalToSuperview()
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
} }
homeTableView.delegate = self
homeTableView.dataSource = self tableHeadView = YHServerTableHeadView()
tableHeadView.titleLabel.text = "香港身份攻略"
tableHeadView.frame = CGRect(x: 0, y: -365 - 48, width: KScreenWidth, height: 365)
sectionView.frame = CGRect(x: 0, y: -48, width: KScreenWidth, height: 48)
homeCollectView.addSubview(tableHeadView)
homeCollectView.addSubview(sectionView)
homeCollectView.contentInset = UIEdgeInsets(top: 365 + 48, left: 0, bottom: 0, right: 0)
homeCollectView.delegate = self
homeCollectView.dataSource = self
homeCollectView.es.addInfiniteScrolling {
self.loadMoreData()
}
} }
func setScrollState() { func loadMoreData() {
let offsetY = homeTableView.contentOffset.y self.homeViewModel.getList(false, self.classId) {[weak self] success, error in
if offsetY >= 365 { guard let self = self else { return }
homeTableView.isScrollEnabled = false DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.35, execute: {
cell.tableFootView.myCollectView.isScrollEnabled = true CATransaction.setDisableActions(true)
} else { self.dataSouce = self.homeViewModel.arrHomeNewsData ?? []
homeTableView.isScrollEnabled = true CATransaction.commit()
cell.tableFootView.myCollectView.isScrollEnabled = false self.homeCollectView.es.stopLoadingMore()
if self.homeViewModel.hasMoreForHomeNews == false {
self.homeCollectView.es.noticeNoMoreData()
}
})
} }
} }
} }
// MARK: - UITableViewDelegate 和 UITableViewDataSource extension YHServerHKLifeViewController: UICollectionViewDelegate, UICollectionViewDataSource {
extension YHServerHKLifeViewController : UITableViewDelegate,UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if sectionView.items.count == 1 {
return 0
}
return 48
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return sectionView return self.dataSouce.count
} }
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
return 0.01 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: YHHomeCollectionViewCell.cellReuseIdentifier, for: indexPath) as! YHHomeCollectionViewCell
} cell.listModel = self.dataSouce[indexPath.row]
return cell
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return UIView()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// return KScreenHeight - k_Height_NavigationtBarAndStatuBar - 48 - k_Height_safeAreaInsetsBottom() - 50
return self.view.frame.height - 48
} }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
cell = tableView.dequeueReusableCell(withClass: YHServerHKLifeViewCell.self) guard let model = self.dataSouce[indexPath.row] else { return }
cell.moreBlock = {[weak self] in if model.type == 2 {
guard let self = self else { return } let vc = YHHomeWebViewController()
self.homeViewModel.getList(false, self.classId) {[weak self] success, error in vc.url = YHBaseUrlManager.shared.curH5URL() + "articleDetail.html" + "?id=\(model.id)"
guard let self = self else { return } vc.id = model.id
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.35, execute: { vc.block = { item in
CATransaction.setDisableActions(true) let arr = self.dataSouce
self.dataSouce = self.homeViewModel.arrHomeNewsData ?? [] for (index,targetItem) in arr.enumerated() {
CATransaction.commit() guard let target = targetItem else { return }
self.cell.tableFootView.myCollectView.es.stopLoadingMore() if target.id == item.id {
if self.homeViewModel.hasMoreForHomeNews == false { target.is_like = item.is_like
self.cell.tableFootView.myCollectView.es.noticeNoMoreData() target.like_count = item.like_count
self.homeCollectView.reloadItems(at: [IndexPath.SubSequence(item: index, section: 0)])
} }
}) }
} }
self.navigationController?.pushViewController(vc)
} else if model.type == 1 {
printLog("直接播放视频")
} }
cell.scrollBlock = { [weak self] falg in
guard let self = self else { return }
tableView.isScrollEnabled = falg
}
cell.tableFootView.items = dataSouce
// cell.tableFootView.myCollectView.es.removeRefreshFooter()
cell.selectionStyle = .none
// cell.tableFootView.myCollectView.isScrollEnabled = false
cell.tableFootView.isNeedScrollBlock = true
return cell
} }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offset = scrollView.contentOffset.y
if offset > -48 {
sectionView.frame.origin.y = offset
} else {
sectionView.frame.origin.y = -48
}
}
}
extension YHServerHKLifeViewController : CollectionViewWaterfallLayoutDelegate {
func collectionView(_ collectionView: UICollectionView, layout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
guard let model = self.dataSouce[indexPath.row] else { return CGSize.zero }
return CGSize(width: model.img_width_cell, height: model.img_height_cell)
} }
// func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if scrollView == homeTableView {
// let offsetY = homeTableView.contentOffset.y
// if offsetY >= 365 {
// homeTableView.isScrollEnabled = false
// cell.tableFootView.myCollectView.isScrollEnabled = true
// } else {
// homeTableView.isScrollEnabled = true
// cell.tableFootView.myCollectView.isScrollEnabled = false
// }
// }
// }
//
// func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
// // 用户停止拖拽时调用,可以执行一些后续操作
// if scrollView == homeTableView {
// let offsetY = homeTableView.contentOffset.y
// if offsetY >= 365 {
// homeTableView.isScrollEnabled = false
// cell.tableFootView.myCollectView.isScrollEnabled = true
// } else {
// homeTableView.isScrollEnabled = true
// cell.tableFootView.myCollectView.isScrollEnabled = false
// }
// }
// }
//
// func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// // 滚动减速完成时调用,表示滚动完全停止
// if scrollView == homeTableView {
// let offsetY = homeTableView.contentOffset.y
// if offsetY >= 365 {
// homeTableView.isScrollEnabled = false
// cell.tableFootView.myCollectView.isScrollEnabled = true
// } else {
// homeTableView.isScrollEnabled = true
// cell.tableFootView.myCollectView.isScrollEnabled = false
// }
// }
// }
} }
extension YHServerHKLifeViewController: JXSegmentedListContainerViewListDelegate { extension YHServerHKLifeViewController: JXSegmentedListContainerViewListDelegate {
......
...@@ -18,23 +18,25 @@ class YHServiceListViewController: YHBaseViewController { ...@@ -18,23 +18,25 @@ class YHServiceListViewController: YHBaseViewController {
var cell: YHServerHKLifeViewCell! var cell: YHServerHKLifeViewCell!
var dataSouce: [YHHomeListModel?] = [] { var dataSouce: [YHHomeListModel?] = [] {
didSet { didSet {
cell.tableFootView.items = dataSouce homeCollectView.reloadData()
} }
} }
var homeTableView: UITableView = {
let tableView = UITableView(frame: .zero, style: .plain) lazy var homeCollectView = {
if #available(iOS 15.0, *) { // 设置布局方向
tableView.sectionHeaderTopPadding = 0 let flowLayout = YHHomeCollectionLayout()
} flowLayout.minimumInteritemSpacing = 7.0
tableView.backgroundColor = .clear flowLayout.minimumColumnSpacing = 7.0
tableView.separatorStyle = .none flowLayout.sectionInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
tableView.showsHorizontalScrollIndicator = false
tableView.showsVerticalScrollIndicator = false let collectinoView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
tableView.rowHeight = UITableView.automaticDimension collectinoView.backgroundColor = .white
tableView.estimatedRowHeight = 81.0 collectinoView.register(YHHomeCollectionViewCell.self, forCellWithReuseIdentifier:YHHomeCollectionViewCell.cellReuseIdentifier)
tableView.bounces = false collectinoView.delegate = self
tableView.register(YHServerHKLifeViewCell.self,forCellReuseIdentifier: YHServerHKLifeViewCell.cellReuseIdentifier) collectinoView.dataSource = self
return tableView collectinoView.translatesAutoresizingMaskIntoConstraints = false
collectinoView.alwaysBounceVertical = true
return collectinoView
}() }()
override func viewDidLoad() { override func viewDidLoad() {
...@@ -71,7 +73,7 @@ extension YHServiceListViewController { ...@@ -71,7 +73,7 @@ extension YHServiceListViewController {
guard let self = self else { return } guard let self = self else { return }
self.dataSouce = self.homeViewModel.arrHomeNewsData ?? [] self.dataSouce = self.homeViewModel.arrHomeNewsData ?? []
if self.homeViewModel.hasMoreForHomeNews == false { if self.homeViewModel.hasMoreForHomeNews == false {
self.homeTableView.es.noticeNoMoreData() self.homeCollectView.es.noticeNoMoreData()
} }
} }
} }
...@@ -88,154 +90,110 @@ extension YHServiceListViewController { ...@@ -88,154 +90,110 @@ extension YHServiceListViewController {
let view = YHServiceSectionView() let view = YHServiceSectionView()
view.block = {[weak self] model in view.block = {[weak self] model in
guard let self = self else { return } guard let self = self else { return }
self.cell.tableFootView.myCollectView.es.resetNoMoreData() self.homeCollectView.es.resetNoMoreData()
self.cell.tableFootView.myCollectView.setContentOffset(CGPoint.zero, animated: false) if homeCollectView.contentOffset.y > -48 {
self.setScrollState() self.homeCollectView.setContentOffset(CGPoint(x: 0, y: -48), animated: false)
}
self.classId = model.id self.classId = model.id
self.homeViewModel.getList(true, model.id) {[weak self] success, error in self.homeViewModel.getList(true, model.id) {[weak self] success, error in
guard let self = self else { return } guard let self = self else { return }
self.dataSouce = self.homeViewModel.arrHomeNewsData ?? [] self.dataSouce = self.homeViewModel.arrHomeNewsData ?? []
if self.homeViewModel.hasMoreForHomeNews == false { if self.homeViewModel.hasMoreForHomeNews == false {
self.homeTableView.es.noticeNoMoreData() self.homeCollectView.es.noticeNoMoreData()
} }
} }
} }
return view return view
}() }()
tableHeadView = YHServerTableHeadView() view.addSubview(homeCollectView)
tableHeadView.titleLabel.text = "香港身份攻略" homeCollectView.snp.makeConstraints { make in
tableHeadView.frame = CGRect(x: 0, y: 0, width: KScreenWidth, height: 365)
view.addSubview(homeTableView)
homeTableView.tableHeaderView = tableHeadView
homeTableView.tableFooterView = tableFootView
homeTableView.snp.makeConstraints { make in
make.top.left.right.equalToSuperview() make.top.left.right.equalToSuperview()
make.bottom.equalToSuperview() make.bottom.equalToSuperview()
} }
homeTableView.delegate = self
homeTableView.dataSource = self tableHeadView = YHServerTableHeadView()
tableHeadView.titleLabel.text = "香港身份攻略"
tableHeadView.frame = CGRect(x: 0, y: -365 - 48, width: KScreenWidth, height: 365)
sectionView.frame = CGRect(x: 0, y: -48, width: KScreenWidth, height: 48)
homeCollectView.addSubview(tableHeadView)
homeCollectView.addSubview(sectionView)
homeCollectView.contentInset = UIEdgeInsets(top: 365 + 48, left: 0, bottom: 0, right: 0)
homeCollectView.delegate = self
homeCollectView.dataSource = self
homeCollectView.es.addInfiniteScrolling {
self.loadMoreData()
}
} }
func setScrollState() { func loadMoreData() {
let offsetY = homeTableView.contentOffset.y self.homeViewModel.getList(false, self.classId) {[weak self] success, error in
if offsetY >= 365 { guard let self = self else { return }
homeTableView.isScrollEnabled = false DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.35, execute: {
cell.tableFootView.myCollectView.isScrollEnabled = true CATransaction.setDisableActions(true)
} else { self.dataSouce = self.homeViewModel.arrHomeNewsData ?? []
homeTableView.isScrollEnabled = true CATransaction.commit()
cell.tableFootView.myCollectView.isScrollEnabled = false self.homeCollectView.es.stopLoadingMore()
if self.homeViewModel.hasMoreForHomeNews == false {
self.homeCollectView.es.noticeNoMoreData()
}
})
} }
} }
} }
// MARK: - UITableViewDelegate 和 UITableViewDataSource extension YHServiceListViewController: UICollectionViewDelegate, UICollectionViewDataSource {
extension YHServiceListViewController : UITableViewDelegate,UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if sectionView.items.count == 1 {
return 0
}
return 48
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return sectionView return self.dataSouce.count
} }
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
return 0.01 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: YHHomeCollectionViewCell.cellReuseIdentifier, for: indexPath) as! YHHomeCollectionViewCell
} cell.listModel = self.dataSouce[indexPath.row]
return cell
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
return UIView()
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return self.view.frame.height - 48
} }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
cell = tableView.dequeueReusableCell(withClass: YHServerHKLifeViewCell.self) guard let model = self.dataSouce[indexPath.row] else { return }
cell.moreBlock = {[weak self] in if model.type == 2 {
guard let self = self else { return } let vc = YHHomeWebViewController()
self.homeViewModel.getList(false, self.classId) {[weak self] success, error in vc.url = YHBaseUrlManager.shared.curH5URL() + "articleDetail.html" + "?id=\(model.id)"
guard let self = self else { return } vc.id = model.id
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.35, execute: { vc.block = { item in
CATransaction.setDisableActions(true) let arr = self.dataSouce
self.dataSouce = self.homeViewModel.arrHomeNewsData ?? [] for (index,targetItem) in arr.enumerated() {
CATransaction.commit() guard let target = targetItem else { return }
self.cell.tableFootView.myCollectView.es.stopLoadingMore() if target.id == item.id {
if self.homeViewModel.hasMoreForHomeNews == false { target.is_like = item.is_like
self.cell.tableFootView.myCollectView.es.noticeNoMoreData() target.like_count = item.like_count
self.homeCollectView.reloadItems(at: [IndexPath.SubSequence(item: index, section: 0)])
} }
}) }
} }
self.navigationController?.pushViewController(vc)
} else if model.type == 1 {
printLog("直接播放视频")
} }
cell.scrollBlock = { [weak self] falg in
guard let self = self else { return }
tableView.isScrollEnabled = falg
}
cell.tableFootView.items = dataSouce
cell.selectionStyle = .none
// cell.tableFootView.myCollectView.isScrollEnabled = false
cell.tableFootView.isNeedScrollBlock = true
return cell
} }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offset = scrollView.contentOffset.y
if offset > -48 {
sectionView.frame.origin.y = offset
} else {
sectionView.frame.origin.y = -48
}
}
}
extension YHServiceListViewController : CollectionViewWaterfallLayoutDelegate {
func collectionView(_ collectionView: UICollectionView, layout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
guard let model = self.dataSouce[indexPath.row] else { return CGSize.zero }
return CGSize(width: model.img_width_cell, height: model.img_height_cell)
} }
// func scrollViewDidScroll(_ scrollView: UIScrollView) {
// if scrollView == homeTableView {
// let offsetY = homeTableView.contentOffset.y
// if offsetY >= 365 {
// homeTableView.isScrollEnabled = false
// cell.tableFootView.myCollectView.isScrollEnabled = true
// } else {
// homeTableView.isScrollEnabled = true
// cell.tableFootView.myCollectView.isScrollEnabled = false
// }
// }
// }
//
// func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
// // 用户停止拖拽时调用,可以执行一些后续操作
// if scrollView == homeTableView {
// let offsetY = homeTableView.contentOffset.y
// if offsetY >= 365 {
// homeTableView.isScrollEnabled = false
// cell.tableFootView.myCollectView.isScrollEnabled = true
// } else {
// homeTableView.isScrollEnabled = true
// cell.tableFootView.myCollectView.isScrollEnabled = false
// }
// }
// }
//
// func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
// // 滚动减速完成时调用,表示滚动完全停止
// if scrollView == homeTableView {
// let offsetY = homeTableView.contentOffset.y
// if offsetY >= 365 {
// homeTableView.isScrollEnabled = false
// cell.tableFootView.myCollectView.isScrollEnabled = true
// } else {
// homeTableView.isScrollEnabled = true
// cell.tableFootView.myCollectView.isScrollEnabled = false
// }
// }
// }
} }
extension YHServiceListViewController: JXSegmentedListContainerViewListDelegate { extension YHServiceListViewController: JXSegmentedListContainerViewListDelegate {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment