SearchResultViewController.swift 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. //
  2. // SearchResultViewController.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/4/23.
  6. // Copyright © 2019 南鑫林. All rights reserved.
  7. //
  8. import UIKit
  9. import JXSegmentedView
  10. class SearchResultViewController: BaseViewController {
  11. deinit {
  12. if observe != nil {
  13. NotificationCenter.default.removeObserver(observe!)
  14. }
  15. }
  16. weak var observe : NSObjectProtocol?
  17. var keyWord : String!
  18. var searchType : SearchType = .content
  19. override func viewDidLoad() {
  20. super.viewDidLoad()
  21. setupViews()
  22. setupLayouts()
  23. setupData()
  24. }
  25. override func setupViews() {
  26. navigationBar.leftButton.isHidden = true
  27. navigationBar.addSubview(navigationBarView)
  28. view.addSubview(segmentedView)
  29. view.addSubview(listContainerView)
  30. }
  31. override func setupLayouts() {
  32. navigationBarView.snp.makeConstraints { (make) in
  33. make.top.equalTo(kSafeStatusBarHeight)
  34. make.bottom.left.right.equalToSuperview()
  35. }
  36. segmentedView.snp.makeConstraints { (make) in
  37. make.left.equalToSuperview()
  38. make.right.equalToSuperview()
  39. make.height.equalTo(48)
  40. make.top.equalTo(kNavBarTotalHeight)
  41. }
  42. listContainerView.snp.makeConstraints { (make) in
  43. make.top.equalTo(segmentedView.snp.bottom)
  44. make.left.right.bottom.equalToSuperview()
  45. }
  46. }
  47. override func setupData() {
  48. segmentedReload()
  49. navigationBarView.backBlock = {
  50. [weak self] in
  51. self?.navigationController?.popViewController(animated: true)
  52. }
  53. navigationBarView.searchResultBlock = {
  54. [weak self] keyWord in
  55. self?.keyWord = keyWord
  56. self?.segmentedReload()
  57. }
  58. // 商品详情页面
  59. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("SearchProductList"), object: nil, queue: OperationQueue.main) {
  60. [weak self] (notification) in
  61. let productSearchModel = notification.object as! ProductSearchModel
  62. let vc = ProductDetailViewController()
  63. vc.productId = productSearchModel.id
  64. vc.shopId = productSearchModel.shopId
  65. self?.navigationController?.pushViewController(vc, animated: true)
  66. }
  67. // 用户页面
  68. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("OtherPersonalCenter"), object: nil, queue: OperationQueue.main) {
  69. [weak self] (notification) in
  70. let uid = notification.object as! Int
  71. if uid != UserModel.shared().getModel()?.uid {
  72. let vc = OtherPersonalCenterViewController()
  73. vc.uid = uid
  74. self?.navigationController?.pushViewController(vc, animated: true)
  75. }
  76. }
  77. // 话题详情页面
  78. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("CommunityFeaturedTopics"), object: nil, queue: OperationQueue.main) {
  79. [weak self] (notification) in
  80. let communityTopicDataModel = notification.object as! CommunityTopicDataModel
  81. let vc = CommunityFeaturedTopicsViewController()
  82. vc.id = communityTopicDataModel.id!
  83. self?.navigationController?.pushViewController(vc, animated: true)
  84. }
  85. // 内容详情页面
  86. observe = NotificationCenter.default.addObserver(forName: NSNotification.Name("SearchContentList"), object: nil, queue: OperationQueue.main) {
  87. [weak self] (notification) in
  88. let communityPostDataModel = notification.object as! CommunityPostDataModel
  89. if PostType(rawValue: communityPostDataModel.type ?? "image") == .image || PostType(rawValue: communityPostDataModel.type ?? "html") == .html {
  90. let vc = CommunityRecommendController()
  91. vc.id = communityPostDataModel.id ?? 0
  92. self?.navigationController?.pushViewController(vc, animated: true)
  93. }else {
  94. let vc = CommunityVideoListController()
  95. vc.contentId = communityPostDataModel.id ?? 0
  96. self?.navigationController?.pushViewController(vc, animated: true)
  97. }
  98. }
  99. }
  100. private lazy var navigationBarView: SearchResultNavigationbarView = {
  101. let navigationBarView = SearchResultNavigationbarView()
  102. navigationBarView.searchTextField.text = keyWord
  103. return navigationBarView
  104. }()
  105. //1.初始化JXSegmentedViewx
  106. private lazy var segmentedView: JXSegmentedView = {
  107. let segmentedView = JXSegmentedView()
  108. segmentedView.delegate = self
  109. segmentedView.dataSource = segmentedDataSource
  110. segmentedView.indicators = [indicator]
  111. segmentedView.contentScrollView = listContainerView.scrollView
  112. return segmentedView
  113. }()
  114. //2.初始化dataSource
  115. private lazy var segmentedDataSource: JXSegmentedTitleDataSource = {
  116. let segmentedDataSource = JXSegmentedTitleDataSource()
  117. segmentedDataSource.titles = ["内容","话题","用户","商品"]
  118. segmentedDataSource.isTitleColorGradientEnabled = true
  119. segmentedDataSource.isItemSpacingAverageEnabled = true
  120. segmentedDataSource.isTitleZoomEnabled = true
  121. segmentedDataSource.itemSpacing = 30
  122. segmentedDataSource.titleNormalColor = kbbbbbbColor
  123. segmentedDataSource.titleSelectedColor = k333333Color
  124. segmentedDataSource.titleNormalFont = kRegularFont14!
  125. segmentedDataSource.titleSelectedFont = kBoldFont22
  126. return segmentedDataSource
  127. }()
  128. //3.初始化指示器indicator
  129. private lazy var indicator: JXSegmentedIndicatorLineView = {
  130. let indicator = JXSegmentedIndicatorLineView()
  131. indicator.indicatorColor = kThemeColor
  132. indicator.indicatorHeight = 4
  133. indicator.indicatorWidth = 20
  134. return indicator
  135. }()
  136. //4.初始化JXSegmentedListContainerView
  137. private lazy var listContainerView: JXSegmentedListContainerView = {
  138. let listContainerView = JXSegmentedListContainerView(dataSource: self)
  139. listContainerView.didAppearPercent = 0.01
  140. return listContainerView
  141. }()
  142. ///5.刷新数据
  143. func segmentedReload() {
  144. segmentedView.selectItemAt(index: searchType.rawValue)
  145. segmentedView.defaultSelectedIndex = searchType.rawValue
  146. listContainerView.defaultSelectedIndex = searchType.rawValue
  147. //reloadData(selectedIndex:)方法一定要调用,方法内部会刷新数据源数组
  148. segmentedDataSource.reloadData(selectedIndex: searchType.rawValue)
  149. listContainerView.reloadData()
  150. segmentedView.reloadData()
  151. }
  152. }
  153. extension SearchResultViewController : JXSegmentedViewDelegate {
  154. //点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,而不关心具体是点击还是滚动选中的情况。
  155. func segmentedView(_ segmentedView: JXSegmentedView, didSelectedItemAt index: Int) {
  156. searchType = SearchType(rawValue: index)!
  157. }
  158. // 点击选中的情况才会调用该方法
  159. func segmentedView(_ segmentedView: JXSegmentedView, didClickSelectedItemAt index: Int) {
  160. //传递didClickSelectedItemAt事件给listContainerView,必须调用!!!
  161. listContainerView.didClickSelectedItem(at: index)
  162. }
  163. // 滚动选中的情况才会调用该方法
  164. func segmentedView(_ segmentedView: JXSegmentedView, didScrollSelectedItemAt index: Int) {
  165. }
  166. // 正在滚动中的回调
  167. func segmentedView(_ segmentedView: JXSegmentedView, scrollingFrom leftIndex: Int, to rightIndex: Int, percent: CGFloat) {
  168. //传递scrolling事件给listContainerView,必须调用!!!
  169. listContainerView.segmentedViewScrolling(from: leftIndex, to: rightIndex, percent: percent, selectedIndex: segmentedView.selectedIndex)
  170. }
  171. /// 是否允许点击选中目标index的item
  172. func segmentedView(_ segmentedView: JXSegmentedView, canClickItemAt index: Int) -> Bool {
  173. return true
  174. }
  175. }
  176. extension SearchResultViewController :JXSegmentedListContainerViewDataSource {
  177. func numberOfLists(in listContainerView: JXSegmentedListContainerView) -> Int {
  178. if let titleDataSource = segmentedView.dataSource as? JXSegmentedBaseDataSource {
  179. return titleDataSource.dataSource.count
  180. }
  181. return 0
  182. }
  183. func listContainerView(_ listContainerView: JXSegmentedListContainerView, initListAt index: Int) -> JXSegmentedListContainerViewListDelegate {
  184. switch index {
  185. /// 内容
  186. case 0:
  187. let vc = SearchContentListViewController()
  188. vc.keyWord = keyWord
  189. return vc
  190. /// 话题
  191. case 1:
  192. let vc = SearchTopicListViewController()
  193. vc.keyWord = keyWord
  194. return vc
  195. /// 用户
  196. case 2:
  197. let vc = SearchUserListViewController()
  198. vc.keyWord = keyWord
  199. return vc
  200. /// 商品
  201. default:
  202. let vc = SearchProductListViewController()
  203. vc.keyWord = keyWord
  204. return vc
  205. }
  206. }
  207. }