
主要变更: 1. 从 AppDelegate 中移除 Core Data 相关的属性和方法,简化应用结构。 2. 新增 EPBaseListViewController 作为消息列表的基础类,提供通用的表视图功能。 3. 添加 EPMessageListVC、EPFriendListVC、EPFollowingListVC 和 EPFansListVC,分别用于展示消息、朋友、关注和粉丝列表。 4. 引入 EPMessageSegmentView 以支持消息主界面的分段控制。 此更新旨在提升代码的可维护性,简化数据管理,并增强用户界面的功能性和交互性。
93 lines
3.5 KiB
Swift
93 lines
3.5 KiB
Swift
import UIKit
|
||
import SnapKit
|
||
|
||
final class EPMessageMainViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
|
||
// 外部回调:未读数变化
|
||
var unreadCountDidChange: ((Int)->Void)?
|
||
|
||
private let segment = EPMessageSegmentView()
|
||
private let pageVC = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal)
|
||
|
||
private lazy var pages: [UIViewController] = {
|
||
return [
|
||
EPMessageListVC(),
|
||
EPFriendListVC(),
|
||
EPFollowingListVC(),
|
||
EPFansListVC()
|
||
]
|
||
}()
|
||
|
||
private var currentIndex: Int = 0
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
view.backgroundColor = UIColor.black.withAlphaComponent(0.92)
|
||
title = YMLocalizedString("XPSessionMainViewController0")
|
||
|
||
setupSegment()
|
||
setupPageVC()
|
||
|
||
// 模拟未读变化(后续接入桥接器)
|
||
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [weak self] in
|
||
self?.unreadCountDidChange?(12)
|
||
}
|
||
}
|
||
|
||
private func setupSegment() {
|
||
view.addSubview(segment)
|
||
segment.snp.makeConstraints { make in
|
||
make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(8)
|
||
make.leading.trailing.equalToSuperview().inset(20)
|
||
make.height.equalTo(48)
|
||
}
|
||
segment.didSelect = { [weak self] index in
|
||
self?.setPage(index: index, animated: true)
|
||
}
|
||
}
|
||
|
||
private func setupPageVC() {
|
||
addChild(pageVC)
|
||
view.addSubview(pageVC.view)
|
||
pageVC.view.backgroundColor = .clear
|
||
pageVC.view.snp.makeConstraints { make in
|
||
make.top.equalTo(segment.snp.bottom).offset(8)
|
||
make.leading.trailing.bottom.equalTo(view.safeAreaLayoutGuide)
|
||
}
|
||
pageVC.didMove(toParent: self)
|
||
pageVC.dataSource = self
|
||
pageVC.delegate = self
|
||
pageVC.setViewControllers([pages[0]], direction: .forward, animated: false)
|
||
}
|
||
|
||
private func setPage(index: Int, animated: Bool) {
|
||
guard index != currentIndex, index >= 0, index < pages.count else { return }
|
||
let direction: UIPageViewController.NavigationDirection = index > currentIndex ? .forward : .reverse
|
||
pageVC.setViewControllers([pages[index]], direction: direction, animated: animated)
|
||
currentIndex = index
|
||
segment.select(index: index, animated: animated)
|
||
title = segment.titles[index]
|
||
}
|
||
|
||
// MARK: - UIPageViewControllerDataSource
|
||
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
|
||
guard let idx = pages.firstIndex(of: viewController), idx > 0 else { return nil }
|
||
return pages[idx - 1]
|
||
}
|
||
|
||
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
|
||
guard let idx = pages.firstIndex(of: viewController), idx < pages.count - 1 else { return nil }
|
||
return pages[idx + 1]
|
||
}
|
||
|
||
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
|
||
guard completed, let vc = pageViewController.viewControllers?.first, let idx = pages.firstIndex(of: vc) else { return }
|
||
currentIndex = idx
|
||
segment.select(index: idx, animated: true)
|
||
title = segment.titles[idx]
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|