238 lines
7.8 KiB
Swift
238 lines
7.8 KiB
Swift
|
|
//
|
|||
|
|
// DiscoverRolesGridController.swift
|
|||
|
|
// Crush
|
|||
|
|
//
|
|||
|
|
// Created by Leon on 2025/9/8.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
import JXPagingView
|
|||
|
|
import UIKit
|
|||
|
|
|
|||
|
|
class DiscoverRolesGridController: CLBaseGridController {
|
|||
|
|
var viewModel: DiscoverHomeRolesViewModel!
|
|||
|
|
|
|||
|
|
var tagsChooseView = HorizontalScrollTagsView()
|
|||
|
|
|
|||
|
|
var selectTagCodes = [String]()
|
|||
|
|
var allCatogryTab: Bool = false
|
|||
|
|
|
|||
|
|
// 分页加载过的aiId,第一页请求时清空
|
|||
|
|
var loadedAiIds = [Int]()
|
|||
|
|
|
|||
|
|
// Flag
|
|||
|
|
var refreshDatasWhenAppear:Bool = false
|
|||
|
|
|
|||
|
|
override func viewDidLoad() {
|
|||
|
|
super.viewDidLoad()
|
|||
|
|
|
|||
|
|
// Do any additional setup after loading the view.
|
|||
|
|
setupViews()
|
|||
|
|
setupDatas()
|
|||
|
|
setupEvents()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override func viewDidAppear(_ animated: Bool) {
|
|||
|
|
super.viewDidAppear(animated)
|
|||
|
|
|
|||
|
|
if refreshDatasWhenAppear{
|
|||
|
|
collectionView.mj_header?.beginRefreshing()
|
|||
|
|
refreshDatasWhenAppear = false
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupViews() {
|
|||
|
|
|
|||
|
|
if allCatogryTab{
|
|||
|
|
collectionView.snp.remakeConstraints { make in
|
|||
|
|
make.edges.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
}else{
|
|||
|
|
view.addSubview(tagsChooseView)
|
|||
|
|
tagsChooseView.snp.makeConstraints { make in
|
|||
|
|
make.top.leading.trailing.equalToSuperview()
|
|||
|
|
make.height.equalTo(56)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
collectionView.snp.remakeConstraints { make in
|
|||
|
|
make.top.equalTo(tagsChooseView.snp.bottom)
|
|||
|
|
make.leading.trailing.bottom.equalToSuperview()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
navigationView.isHidden = true
|
|||
|
|
collectionView.register(MeRootPageRollCell.self, forCellWithReuseIdentifier: "MeRootPageRollCell")
|
|||
|
|
collectionView.register(UICollectionReusableView.self,
|
|||
|
|
forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader,
|
|||
|
|
withReuseIdentifier: "UICollectionReusableView")
|
|||
|
|
|
|||
|
|
let lr = CGFloat.lrs
|
|||
|
|
let itemW = (UIScreen.width - lr * 2 - 16) * 0.5
|
|||
|
|
let itemH = itemW * 260 / 165.0 + 112
|
|||
|
|
|
|||
|
|
layout.scrollDirection = .vertical
|
|||
|
|
layout.minimumLineSpacing = 0
|
|||
|
|
layout.minimumInteritemSpacing = 16
|
|||
|
|
layout.sectionInset = .init(top: 12, left: lr, bottom: 24 + UIWindow.safeAreaBottom, right: lr)
|
|||
|
|
layout.itemSize = .init(width: itemW, height: itemH)
|
|||
|
|
layout.invalidateLayout()
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
addRefreshHeaderFooter()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupDatas() {
|
|||
|
|
// collectionView.mj_header?.beginRefreshing()
|
|||
|
|
loadNewData()
|
|||
|
|
|
|||
|
|
if allCatogryTab == false{
|
|||
|
|
var tagsName = [String]()
|
|||
|
|
for per in viewModel.tags ?? [] {
|
|||
|
|
let formatString = "#\(per.name)"
|
|||
|
|
tagsName.append(formatString)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
tagsChooseView.setTags(tagsName)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override func loadData() {
|
|||
|
|
|
|||
|
|
if page == 1{
|
|||
|
|
loadedAiIds.removeAll()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
viewModel.loadRoles(pn: page, codes: selectTagCodes, exList: loadedAiIds) { [weak self] status, roles in
|
|||
|
|
self?.collectionView.mj_header?.endRefreshing()
|
|||
|
|
self?.collectionView.mj_footer?.endRefreshing()
|
|||
|
|
if status {
|
|||
|
|
let array = roles ?? []
|
|||
|
|
|
|||
|
|
for per in array {
|
|||
|
|
if let theId = per.aiId{
|
|||
|
|
self?.loadedAiIds.append(theId)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if self?.page == 1 {
|
|||
|
|
self?.collectionView.contentOffset = .zero
|
|||
|
|
self?.datas = array
|
|||
|
|
self?.collectionView.mj_footer?.resetNoMoreData()
|
|||
|
|
// self?.view.setupEmpty(empty: array.count <= 0, msg: "暂无角色")
|
|||
|
|
if array.count > 0 {
|
|||
|
|
self?.view.hideEmpty()
|
|||
|
|
} else {
|
|||
|
|
self?.view.showStartYEmpty(text: "暂无角色", startY: 96)
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
self?.datas.append(contentsOf: array)
|
|||
|
|
if array.count <= 0 {
|
|||
|
|
self?.collectionView.mj_footer?.endRefreshingWithNoMoreData()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
self?.collectionView.reloadData()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private func setupEvents() {
|
|||
|
|
|
|||
|
|
tagsChooseView.selectionCallback = {[weak self] selectedTags, selectedIndices in
|
|||
|
|
guard let `self` = self else {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
print("选中的标签: \(selectedTags)")
|
|||
|
|
print("选中的索引: \(selectedIndices)")
|
|||
|
|
|
|||
|
|
self.selectTagCodes.removeAll()
|
|||
|
|
for (index, tag) in (self.viewModel.tags ?? []).enumerated() {
|
|||
|
|
if selectedIndices.contains(index) {
|
|||
|
|
if let code = tag.code {
|
|||
|
|
self.selectTagCodes.append(code)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
self.loadNewData()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - Public
|
|||
|
|
|
|||
|
|
// func tryLoad(code: String) {
|
|||
|
|
// if let tagCode = viewModel.selectTagCode, code == tagCode {
|
|||
|
|
// return
|
|||
|
|
// }
|
|||
|
|
// viewModel.selectTagCode = code
|
|||
|
|
// loadNewData()
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// MARK: - UICollectionView
|
|||
|
|
|
|||
|
|
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
|
|||
|
|
return datas.count
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
|
|||
|
|
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MeRootPageRollCell", for: indexPath) as! MeRootPageRollCell
|
|||
|
|
cell.cellType = .discoverList
|
|||
|
|
if let data = datas[indexPath.item] as? AIRoleInfo {
|
|||
|
|
cell.config(data: data)
|
|||
|
|
}
|
|||
|
|
return cell
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
|
|||
|
|
if let data = datas[indexPath.item] as? AIRoleInfo {
|
|||
|
|
AppRouter.goChatVC(aiId: data.aiId)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
|
|||
|
|
// if kind == UICollectionView.elementKindSectionHeader {
|
|||
|
|
// let header = collectionView.dequeueReusableSupplementaryView(
|
|||
|
|
// ofKind: kind,
|
|||
|
|
// withReuseIdentifier: "UICollectionReusableView",
|
|||
|
|
// for: indexPath
|
|||
|
|
// )
|
|||
|
|
//
|
|||
|
|
// if !allCatogryTab{
|
|||
|
|
// if tagsChooseView.superview == nil || tagsChooseView.superview != header {
|
|||
|
|
// tagsChooseView.removeFromSuperview()
|
|||
|
|
// }
|
|||
|
|
//
|
|||
|
|
// header.addSubview(tagsChooseView)
|
|||
|
|
// tagsChooseView.snp.makeConstraints { make in
|
|||
|
|
// make.top.leading.trailing.equalToSuperview()
|
|||
|
|
// make.bottom.equalToSuperview()
|
|||
|
|
// }
|
|||
|
|
// }
|
|||
|
|
//
|
|||
|
|
// return header
|
|||
|
|
// }
|
|||
|
|
// return UICollectionReusableView()
|
|||
|
|
// }
|
|||
|
|
//
|
|||
|
|
// func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
|
|||
|
|
// let height = allCatogryTab ? 0.0 : 56.0
|
|||
|
|
// return CGSize(width: UIScreen.width, height: height)
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
extension DiscoverRolesGridController {
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
extension DiscoverRolesGridController: JXPagingViewListViewDelegate {
|
|||
|
|
func listView() -> UIView {
|
|||
|
|
return view
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func listScrollView() -> UIScrollView {
|
|||
|
|
return collectionView
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func listViewDidScrollCallback(callback: @escaping (UIScrollView) -> Void) {
|
|||
|
|
listViewDidScrollCallback = callback
|
|||
|
|
}
|
|||
|
|
}
|