KWSearchViewController.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. //
  2. // KWSearchViewController.m
  3. // westkissMob
  4. //
  5. // Created by iOS on 2022/9/13.
  6. //
  7. #import "KWSearchViewController.h"
  8. #import "KWLenovoWordListView.h"
  9. #import "KWSearchSubTypeModel.h"
  10. #import "KWSearchViewModel.h"
  11. @interface KWSearchViewController () <UITextFieldDelegate>
  12. @property (nonatomic, strong) KWSearchViewModel *vm;
  13. @property (nonatomic, strong) KWHisAndHotWordsViewModel *hisVm;
  14. @property (nonatomic, strong) KWLenovoWordListView *lenovoV;
  15. @end
  16. @implementation KWSearchViewController
  17. - (instancetype)init {
  18. self = [super init];
  19. if(self) {
  20. self.vm = [[KWSearchViewModel alloc] init];
  21. [self.vm reqProductTypeList:^() {}];
  22. self.hisVm= [[KWHisAndHotWordsViewModel alloc] init];
  23. }
  24. return self;
  25. }
  26. - (void)viewDidLoad {
  27. [super viewDidLoad];
  28. [self addSubVs];
  29. [self getData];
  30. @weakify(self);
  31. [self.vm reqCurrenciesList:^{
  32. weak_self.leftTableV.moneyType = weak_self.vm.moneyType;
  33. [weak_self.leftTableV reloadData];
  34. if (weak_self.leftTableV.selectIndex >= weak_self.leftTableV.arr.count) {
  35. weak_self.rightTableV.arr = weak_self.vm.moneyType.children;
  36. [weak_self.rightTableV reloadData];
  37. }
  38. }];
  39. }
  40. - (void)viewWillAppear:(BOOL)animated {
  41. [super viewWillAppear:animated];
  42. [self.navigationController setNavigationBarHidden:true];
  43. if (self.vm.arr.count == 0) {
  44. [self getData];
  45. }
  46. }
  47. - (void)viewWillDisappear:(BOOL)animated {
  48. [super viewWillDisappear:animated];
  49. }
  50. - (void)getData {
  51. @weakify(self);
  52. [self.vm reqProductTypeList:^() {
  53. weak_self.leftTableV.arr = weak_self.vm.arr;
  54. for (int i = 0; i < weak_self.vm.arr.count; i++) {
  55. if (weak_self.vm.arr[i] && weak_self.vm.arr[i].children.count > 0) {
  56. weak_self.leftTableV.selectIndex = i;
  57. weak_self.rightTableV.arr = weak_self.vm.arr[i].children;
  58. break;
  59. }
  60. }
  61. [weak_self.leftTableV reloadData];
  62. [weak_self.rightTableV reloadData];
  63. }];
  64. if (self.vm.arr.count > 0) {
  65. self.leftTableV.arr = weak_self.vm.arr;
  66. for (int i = 0; i < weak_self.vm.arr.count; i++) {
  67. if (weak_self.vm.arr[i] && weak_self.vm.arr[i].children.count > 0) {
  68. weak_self.leftTableV.selectIndex = i;
  69. weak_self.rightTableV.arr = weak_self.vm.arr[i].children;
  70. break;
  71. }
  72. }
  73. }
  74. [self.leftTableV reloadData];
  75. [self.rightTableV reloadData];
  76. }
  77. -(void)addSubVs {
  78. self.view.backgroundColor = [UIColor colorWithHexString:@"#f8f8f8"];
  79. self.leftTableV.backgroundColor = [UIColor colorWithHexString:@"#f8f8f8"];
  80. [self.view addSubview:self.topV];
  81. [self.view addSubview:self.bottomV];
  82. [self.topV addSubview:self.searchTf];
  83. [self.bottomV addSubview:self.leftTableV];
  84. [self.bottomV addSubview:self.rightTableV];
  85. [self.topV mas_makeConstraints:^(MASConstraintMaker *make) {
  86. make.top.left.right.equalTo(self.view);
  87. }];
  88. [self.searchTf mas_makeConstraints:^(MASConstraintMaker *make) {
  89. make.left.equalTo(self.topV).offset(20);
  90. make.right.equalTo(self.topV).offset(-20);
  91. make.height.equalTo(@45);
  92. make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(8);
  93. make.bottom.equalTo(self.topV).offset(-8);
  94. }];
  95. [self.bottomV mas_makeConstraints:^(MASConstraintMaker *make) {
  96. make.top.equalTo(self.topV.mas_bottom).offset(10);
  97. make.left.right.equalTo(self.view);
  98. make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom);
  99. }];
  100. [self.leftTableV mas_makeConstraints:^(MASConstraintMaker *make) {
  101. make.width.equalTo(@130);
  102. make.left.top.bottom.equalTo(self.bottomV);
  103. }];
  104. [self.rightTableV mas_makeConstraints:^(MASConstraintMaker *make) {
  105. make.top.bottom.right.equalTo(self.bottomV);
  106. make.left.equalTo(self.leftTableV.mas_right);
  107. }];
  108. [self.view addSubview:self.hisWordV];
  109. self.hisWordV.hidden = true;
  110. [self.hisWordV mas_makeConstraints:^(MASConstraintMaker *make) {
  111. make.leading.trailing.bottom.equalTo(self.view);
  112. make.top.equalTo(self.topV.mas_bottom);
  113. }];
  114. [self.view addSubview:self.lenovoV];
  115. self.lenovoV.hidden = true;
  116. [self.lenovoV mas_makeConstraints:^(MASConstraintMaker *make) {
  117. make.leading.trailing.equalTo(self.searchTf);
  118. make.top.equalTo(self.searchTf.mas_bottom);
  119. make.height.equalTo(@0);
  120. }];
  121. }
  122. - (KWSearchMainTypeTableView *)leftTableV {
  123. if (!_leftTableV) {
  124. KWSearchMainTypeTableView *leftTab = [[KWSearchMainTypeTableView alloc] initWithFrame:CGRectMake(0, 10, 180, self.view.bounds.size.height) style:UITableViewStylePlain];
  125. @weakify(self);
  126. _leftTableV = leftTab;
  127. leftTab.callBack = ^{
  128. NSInteger selectIndex = weak_self.leftTableV.selectIndex;
  129. if (selectIndex >= weak_self.leftTableV.arr.count) {
  130. weak_self.rightTableV.arr = weak_self.leftTableV.moneyType.children;
  131. [weak_self.rightTableV reloadData];
  132. return;
  133. }
  134. KWMainTypeModel *m = weak_self.leftTableV.arr[selectIndex];
  135. if (m.children.count == 0) {
  136. [self toResult:m.title type:m.Id keyWord:@""];
  137. } else {
  138. weak_self.rightTableV.arr = m.children;
  139. [weak_self.rightTableV reloadData];
  140. }
  141. };
  142. }
  143. return _leftTableV;
  144. }
  145. - (KWSearchSubTypeTableView *)rightTableV {
  146. if(!_rightTableV) {
  147. KWSearchSubTypeTableView *tab = [[KWSearchSubTypeTableView alloc] initWithFrame:CGRectMake(0, 10, 180, self.view.bounds.size.height) style:UITableViewStylePlain];
  148. _rightTableV = tab;
  149. @weakify(self);
  150. [_rightTableV setCallBack:^(NSIndexPath * _Nonnull indexP) {
  151. KWSearchSubTypeModel *m = weak_self.rightTableV.arr[indexP.section].children[indexP.item];
  152. [weak_self toResult:m.title type:m.Id keyWord:@""];
  153. }];
  154. [_rightTableV setCallBackSection:^(NSInteger index) {
  155. KWSubTypeSectionModel *m = weak_self.rightTableV.arr[index];
  156. if (m.isMoneyType) {
  157. [MBProgressHUD showHUDAddedTo:weak_self.view animated:true];
  158. [weak_self.vm switchCurrencie:m callback:^(BOOL flag) {
  159. if (flag) {
  160. [[NSNotificationCenter defaultCenter] postNotificationName:MoneyTypeChanged object:nil];
  161. [weak_self.vm reqCurrenciesList:^{
  162. [MBProgressHUD hideHUDForView:weak_self.view animated:true];
  163. weak_self.leftTableV.moneyType = weak_self.vm.moneyType;
  164. weak_self.rightTableV.arr = weak_self.vm.moneyType.children;
  165. [weak_self.rightTableV reloadData];
  166. }];
  167. } else {
  168. [MBProgressHUD hideHUDForView:weak_self.view animated:true];
  169. }
  170. }];
  171. return;
  172. }
  173. [weak_self toResult:m.title type:m.Id keyWord:@""];
  174. }];
  175. }
  176. return _rightTableV;
  177. }
  178. -(UIView *)topV {
  179. if (!_topV) {
  180. UIView *v = [[UIView alloc] init];
  181. v.backgroundColor = _FFD1B9;//[UIColor colorWithHexString:@"#FFF5F0"];
  182. _topV = v;
  183. }
  184. return _topV;
  185. }
  186. -(UIView *)bottomV {
  187. if (!_bottomV) {
  188. UIView *v = [[UIView alloc] init];
  189. v.backgroundColor = [UIColor colorWithHexString:@"#ffffff"];
  190. _bottomV = v;
  191. }
  192. return _bottomV;
  193. }
  194. -(UITextField *)searchTf {
  195. if (!_searchTf) {
  196. UITextField *tf = [[UITextField alloc] init];
  197. tf.delegate = self;
  198. tf.borderStyle = UITextBorderStyleNone;
  199. tf.backgroundColor = UIColor.whiteColor;
  200. tf.font = [UIFont fontWithName:Rob_Regular size:14];
  201. tf.textAlignment = NSTextAlignmentLeft;
  202. tf.placeholder = @"SEARCH FOR PRODUCTS";
  203. tf.textColor = _0B0B0B;
  204. tf.layer.masksToBounds = true;
  205. tf.clearButtonMode = UITextFieldViewModeAlways;
  206. UIView *tfLeftV = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 45)];
  207. UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
  208. btn.frame = tfLeftV.bounds;
  209. [btn setImage:[UIImage imageNamed:@"search_tf"] forState:UIControlStateNormal];
  210. [tfLeftV addSubview:btn];
  211. tf.leftView = tfLeftV;
  212. tf.leftViewMode = UITextFieldViewModeAlways;
  213. _searchTf = tf;
  214. }
  215. return _searchTf;
  216. }
  217. -(KWHisAndHotWordsView *)hisWordV {
  218. if (!_hisWordV) {
  219. KWHisAndHotWordsView *v = [[KWHisAndHotWordsView alloc] initWithFrame:CGRectZero];
  220. v.isSearch = true;
  221. @weakify(self);
  222. [v setCallBack:^(NSString * _Nonnull word) {
  223. weak_self.searchTf.text = word;
  224. [self.hisWordV.vm addSearchData:word];
  225. [weak_self toResult:word type:@"" keyWord:word];
  226. }];
  227. [v setHotCallBack:^(KWSearchHotKeyModel * _Nonnull hot) {
  228. NSString *word = hot.title;
  229. if (hot.type != 1) {
  230. [self.hisWordV.vm addSearchData:word];
  231. [weak_self toResult:word type:hot.code keyWord:@""];
  232. return;
  233. }
  234. [self.hisWordV.vm addSearchData:word];
  235. [weak_self toResult:word type:@"" keyWord:word];
  236. }];
  237. _hisWordV = v;
  238. }
  239. return _hisWordV;
  240. }
  241. - (KWLenovoWordListView *)lenovoV {
  242. if (!_lenovoV) {
  243. KWLenovoWordListView *v = [[KWLenovoWordListView alloc] initWithFrame:CGRectMake(self.searchTf.frame.origin.x, self.topV.maxY - 8, self.searchTf.frame.size.width, 200)];
  244. @weakify(self);
  245. [v setCallBack:^(NSString * _Nonnull word) {
  246. weak_self.searchTf.text = word;
  247. [self.hisWordV.vm addSearchData:word];
  248. [weak_self toResult:word type:@"" keyWord:word];
  249. }];
  250. _lenovoV = v;
  251. }
  252. return _lenovoV;
  253. }
  254. /// show lenovo Words
  255. - (void) showLenovoV:(NSString *)key {
  256. @weakify(self);
  257. [self.hisVm getAboutKeyList:key back:^{
  258. if (weak_self.hisVm.aboutKeys.count > 0 && [self.searchTf.text isEqualToString:key]) {
  259. weak_self.lenovoV.hidden = false;
  260. [weak_self.lenovoV setData:weak_self.hisVm.aboutKeys origen:CGPointMake(self.searchTf.frame.origin.x, self.topV.maxY - 8)];
  261. } else {
  262. weak_self.lenovoV.hidden = true;
  263. }
  264. }];
  265. }
  266. - (void)hideLenovoV {
  267. self.lenovoV.hidden = true;
  268. }
  269. /// show lenovo Words
  270. - (void) showHisWordV {
  271. self.hisWordV.hidden = false;
  272. [_hisWordV reloadData];
  273. }
  274. - (void)hideHisWordV {
  275. self.hisWordV.hidden = true;
  276. }
  277. // MARK: - pushResult
  278. - (void)toResult:(NSString *)key type:(NSString *)type keyWord:(NSString *)word {
  279. NSDictionary *para = @{
  280. @"type":type, //String
  281. @"title":key,//String
  282. @"searchKey":word,//String
  283. };
  284. UIViewController *vc = [CTMediator.sharedInstance getProductListVc:para];
  285. [self.navigationController pushViewController:vc animated:true];
  286. }
  287. // MARK: - uitextfiled delegate
  288. - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
  289. [self showHisWordV];
  290. NSString *txt = textField.text;
  291. if ([txt isEqualToString:@""] ) {
  292. [self hideLenovoV];
  293. } else {
  294. [self showLenovoV:txt];
  295. }
  296. return true;
  297. }
  298. - (BOOL)textFieldShouldClear:(UITextField *)textField {
  299. self.hisVm.aboutKeys = @[];
  300. [self hideLenovoV];
  301. return true;
  302. }
  303. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  304. NSString *txt = textField.text;
  305. txt = [txt stringByReplacingCharactersInRange:range withString:string];
  306. if ([txt isEqualToString:@""] ) {
  307. [self hideLenovoV];
  308. } else {
  309. [self showLenovoV:txt];
  310. }
  311. return true;
  312. }
  313. - (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
  314. return true;
  315. }
  316. - (void)textFieldDidEndEditing:(UITextField *)textField {
  317. [self hideLenovoV];
  318. [self hideHisWordV];
  319. }
  320. - (BOOL)textFieldShouldReturn:(UITextField *)textField {
  321. [textField resignFirstResponder];
  322. NSString *key = textField.text;
  323. if (![key isEmpty]){
  324. [self.hisWordV.vm addSearchData:key];
  325. [self toResult:key type:@"" keyWord:key];
  326. }
  327. return true;
  328. }
  329. @end