HJBasicInfoViewController.m 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. //
  2. // HJBasicInfoViewController.m
  3. // HappyJob
  4. //
  5. // Created by Bob on 2019/4/16.
  6. // Copyright © 2019 Bob. All rights reserved.
  7. //
  8. #import "HJBasicInfoViewController.h"
  9. #import "HJLabelTextFieldView.h"
  10. #import "HJSaveBasicInfoAPIManager.h"
  11. #import "UIViewController+FBImagePicker.h"
  12. #import "HJResumeDataBox.h"
  13. #import "UITextField+LimitLength.h"
  14. #import "HJExpectationViewController.h"
  15. @interface HJBasicInfoViewController ()
  16. <
  17. FBScrollLayoutViewDelegate,
  18. FBAPIManagerDelegate,
  19. UIImagePickerControllerDelegate,
  20. UINavigationControllerDelegate,
  21. UIGestureRecognizerDelegate
  22. >
  23. @property (nonatomic, strong) FBScrollLayoutView *scrollLayoutView;
  24. @property (nonatomic, strong) HJLabelTextFieldView *headerView;
  25. @property (nonatomic, strong) HJLabelTextFieldView *nameView;
  26. @property (nonatomic, strong) HJLabelTextFieldView *sexView;
  27. @property (nonatomic, strong) HJLabelTextFieldView *phoneView;
  28. @property (nonatomic, strong) HJLabelTextFieldView *yearView;
  29. @property (nonatomic, strong) HJLabelTextFieldView *educationView;
  30. @property (nonatomic, strong) HJLabelTextFieldView *WeChatView;
  31. @property (nonatomic, strong) UIButton *saveButton;
  32. @property (nonatomic, strong) ValuePickerView *pickView;
  33. @property (nonatomic, copy) NSArray *yearDataSource;
  34. @property (nonatomic, strong) HJSaveBasicInfoAPIManager *saveResumeBaseInfoAPIManager;
  35. @property (nonatomic, strong) HJResumeDataBox *resumeDataBox;
  36. @end
  37. @implementation HJBasicInfoViewController
  38. #pragma mark - life cycle
  39. - (void)viewWillAppear:(BOOL)animated {
  40. [super viewWillAppear:animated];
  41. [self.navigationController setNavigationBarHidden:NO animated:YES];
  42. if (self.isBackPop)
  43. {
  44. self.navigationController.interactivePopGestureRecognizer.delegate = self;
  45. }
  46. }
  47. - (void)viewDidLoad {
  48. [super viewDidLoad];
  49. self.title = @"个人资料";
  50. [self hj_setupNavBar];
  51. [self.view addSubview:self.scrollLayoutView];
  52. self.view.backgroundColor = COLOR_F5F5F5;
  53. [self.scrollLayoutView.contentView addSubview:self.headerView];
  54. [self.scrollLayoutView.contentView addSubview:self.nameView];
  55. [self.scrollLayoutView.contentView addSubview:self.sexView];
  56. [self.scrollLayoutView.contentView addSubview:self.phoneView];
  57. [self.scrollLayoutView.contentView addSubview:self.yearView];
  58. [self.scrollLayoutView.contentView addSubview:self.educationView];
  59. [self.scrollLayoutView.contentView addSubview:self.WeChatView];
  60. [self.scrollLayoutView.contentView addSubview:self.saveButton];
  61. [self.scrollLayoutView makeConstraints];
  62. }
  63. #pragma mark - 导航栏的代理
  64. - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  65. [self.navigationController setNavigationBarHidden:NO animated:YES];
  66. }
  67. #pragma mark - FBScrollLayoutViewDelegate
  68. - (void)scrollLayoutViewMakeConstraints:(FBScrollLayoutView *)scrollLayoutView {
  69. [scrollLayoutView mas_makeConstraints:^(MASConstraintMaker *make) {
  70. make.left.right.equalTo(self.view);
  71. make.top.equalTo(self.view).offset(10);
  72. make.bottom.equalTo(self.view);
  73. }];
  74. }
  75. - (void)subviewsMakeConstraintsInScrollLayoutView:(FBScrollLayoutView *)scrollLayoutView contentView:(UIView *)contentView {
  76. [self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
  77. make.top.left.right.equalTo(contentView);
  78. make.height.mas_equalTo(88);
  79. }];
  80. [self.headerView.contentImageV mas_remakeConstraints:^(MASConstraintMaker *make) {
  81. make.centerY.equalTo(self.headerView);
  82. make.right.equalTo(self.headerView.rightImageV.mas_left).with.offset(-15);
  83. make.size.mas_offset(CGSizeMake(50, 50));
  84. }];
  85. [self.nameView mas_makeConstraints:^(MASConstraintMaker *make) {
  86. make.top.equalTo(self.headerView.mas_bottom);
  87. make.left.right.equalTo(contentView);
  88. make.height.mas_equalTo(58);
  89. }];
  90. [self.sexView mas_makeConstraints:^(MASConstraintMaker *make) {
  91. make.top.equalTo(self.nameView.mas_bottom);
  92. make.left.right.equalTo(contentView);
  93. make.height.mas_equalTo(self.nameView);
  94. }];
  95. [self.phoneView mas_makeConstraints:^(MASConstraintMaker *make) {
  96. make.top.equalTo(self.sexView.mas_bottom);
  97. make.left.right.equalTo(contentView);
  98. make.height.mas_equalTo(self.nameView);
  99. }];
  100. [self.yearView mas_makeConstraints:^(MASConstraintMaker *make) {
  101. make.top.equalTo(self.phoneView.mas_bottom);
  102. make.left.right.equalTo(contentView);
  103. make.height.mas_equalTo(self.nameView);
  104. }];
  105. [self.educationView mas_makeConstraints:^(MASConstraintMaker *make) {
  106. make.top.equalTo(self.yearView.mas_bottom);
  107. make.left.right.equalTo(contentView);
  108. make.height.mas_equalTo(self.nameView);
  109. }];
  110. [self.WeChatView mas_makeConstraints:^(MASConstraintMaker *make) {
  111. make.top.equalTo(self.educationView.mas_bottom);
  112. make.left.right.equalTo(contentView);
  113. make.height.mas_equalTo(self.nameView);
  114. }];
  115. [self.saveButton mas_makeConstraints:^(MASConstraintMaker *make) {
  116. make.top.equalTo(self.WeChatView.mas_bottom).offset(25);
  117. make.left.equalTo(contentView).offset(15);
  118. make.right.equalTo(contentView).offset(-15);
  119. make.height.mas_equalTo(44);
  120. }];
  121. [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
  122. // 这里的约束一定要等于previousNextView,不然键盘的自动浮动效果有Bug。
  123. make.bottom.equalTo(self.saveButton);
  124. }];
  125. }
  126. #pragma mark - UIImagePickerControllerDelegate
  127. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  128. NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
  129. //当选择的类型是图片
  130. if ([type isEqualToString:@"public.image"])
  131. {
  132. //先把图片转成NSData
  133. UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
  134. self.headerView.contentImageV.image = image;
  135. //关闭相册界面
  136. [self dismissViewControllerAnimated:YES completion:nil];
  137. }
  138. }
  139. - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
  140. [self dismissViewControllerAnimated:YES completion:nil];
  141. }
  142. #pragma mark - FBAPIManagerDelegate
  143. - (void)managerCallAPIDidSuccess:(FBBaseAPIManager *)manager {
  144. if (manager == self.saveResumeBaseInfoAPIManager)
  145. {
  146. id fetchData = [manager fetchDataWithBox:self.resumeDataBox];
  147. if ([fetchData isKindOfClass:[NSString class]])
  148. {
  149. [self.view fb_showSuccessWithStatus:fetchData completion:^{
  150. if (self.isBackPop)
  151. {//返回到上个页面
  152. [self.navigationController popViewControllerAnimated:YES];
  153. }
  154. else
  155. {//不返回
  156. HJExpectationViewController *vc = [[HJExpectationViewController alloc] init];
  157. vc.isPopToRoot = YES;
  158. [self.navigationController pushViewController:vc animated:YES];
  159. }
  160. }];
  161. }
  162. }
  163. }
  164. - (void)managerCallAPIDidFailed:(FBBaseAPIManager *)manager {
  165. if (manager == self.saveResumeBaseInfoAPIManager)
  166. {
  167. id fetchData = [manager fetchDataWithBox:self.resumeDataBox];
  168. if ([fetchData isKindOfClass:[NSString class]])
  169. {
  170. [self.view fb_showFailureWithStatus:fetchData];
  171. }
  172. }
  173. }
  174. #pragma mark - event response
  175. - (void)saveButtonClicked:(UIButton *)sender {
  176. if (self.nameView.contentTextField.text.length == 0)
  177. {
  178. [self.view fb_showFailureWithStatus:@"请先填写您的姓名"];
  179. [self.nameView.contentTextField becomeFirstResponder];
  180. }
  181. else if (self.nameView.contentTextField.text.length > 30)
  182. {
  183. [self.view fb_showFailureWithStatus:@"姓名不能超过30个字符"];
  184. [self.nameView.contentTextField becomeFirstResponder];
  185. }
  186. else if (self.sexView.contentTextField.text.length == 0)
  187. {
  188. [self.view fb_showFailureWithStatus:@"请先填写您的性别"];
  189. [self.sexView.contentTextField becomeFirstResponder];
  190. }
  191. else if (self.phoneView.contentTextField.text.length != 11)
  192. {
  193. [self.view fb_showFailureWithStatus:@"请您填写正确的手机号"];
  194. [self.phoneView.contentTextField becomeFirstResponder];
  195. }
  196. else if (self.yearView.contentTextField.text.length == 0)
  197. {
  198. [self.view fb_showFailureWithStatus:@"请先填写您的出生年份"];
  199. [self.yearView.contentTextField becomeFirstResponder];
  200. }
  201. else if (self.educationView.contentTextField.text.length == 0)
  202. {
  203. [self.view fb_showFailureWithStatus:@"请先填写您的学历"];
  204. [self.educationView.contentTextField becomeFirstResponder];
  205. }
  206. else
  207. {
  208. [self.view fb_showLoading];
  209. UIImage *photo = self.headerView.contentImageV.image;
  210. if (photo && !CGSizeEqualToSize(photo.size, CGSizeZero))
  211. {
  212. self.saveResumeBaseInfoAPIManager.photo = photo;
  213. }
  214. self.saveResumeBaseInfoAPIManager.realName = self.nameView.contentTextField.text;
  215. self.saveResumeBaseInfoAPIManager.phone = self.phoneView.contentTextField.text;
  216. self.saveResumeBaseInfoAPIManager.gender = [self.resumeDataBox.genderDataSource indexOfObject:self.sexView.contentTextField.text];
  217. self.saveResumeBaseInfoAPIManager.birthYear = self.yearView.contentTextField.text;
  218. self.saveResumeBaseInfoAPIManager.education = [self.resumeDataBox.educationDataSource indexOfObject:self.educationView.contentTextField.text] + 1;
  219. self.saveResumeBaseInfoAPIManager.wechatNumber = self.WeChatView.contentTextField.text;
  220. [self.saveResumeBaseInfoAPIManager start];
  221. }
  222. }
  223. - (void)photoButtonClicked{
  224. [self fb_openImagePickerWithPhotoHandler:^(UIImagePickerController * _Nonnull imagePicker)
  225. {
  226. imagePicker.delegate = self;
  227. } cameraHandler:^(UIImagePickerController * _Nonnull imagePicker) {
  228. imagePicker.delegate = self;
  229. } cancelHandler:^{
  230. }];
  231. }
  232. /* 性别选择 */
  233. - (void)sexSelextClicked {
  234. __weak typeof(self) weakSelf = self;
  235. _pickView = [[ValuePickerView alloc]init];
  236. _pickView.dataSource = self.resumeDataBox.genderDataSource;
  237. _pickView.pickerHeight = 256;
  238. [_pickView reloadPickers];
  239. [_pickView show];
  240. _pickView.valueDidSelectWithIndexBlock = ^(NSString *value,NSInteger index){
  241. weakSelf.sexView.contentTextField.text = weakSelf.resumeDataBox.genderDataSource[index];
  242. };
  243. }
  244. /* 出生年份*/
  245. - (void)yearSelextClicked {
  246. __weak typeof(self) weakSelf = self;
  247. _pickView = [[ValuePickerView alloc]init];
  248. _pickView.dataSource = self.yearDataSource;
  249. _pickView.pickerHeight = 256;
  250. [_pickView reloadPickers];
  251. [_pickView show];
  252. _pickView.valueDidSelectWithIndexBlock = ^(NSString *value,NSInteger index){
  253. weakSelf.yearView.contentTextField.text = weakSelf.yearDataSource[index];
  254. };
  255. }
  256. /* 学历选择 */
  257. - (void)educationSelextClicked {
  258. __weak typeof(self) weakSelf = self;
  259. _pickView = [[ValuePickerView alloc]init];
  260. _pickView.dataSource = self.resumeDataBox.educationDataSource;
  261. _pickView.pickerHeight = 256;
  262. [_pickView reloadPickers];
  263. [_pickView show];
  264. _pickView.valueDidSelectWithIndexBlock = ^(NSString *value,NSInteger index){
  265. weakSelf.educationView.contentTextField.text = weakSelf.resumeDataBox.educationDataSource[index];
  266. };
  267. }
  268. #pragma mark - getters and setters
  269. - (HJResumeDataBox *)resumeDataBox {
  270. if (_resumeDataBox == nil)
  271. {
  272. _resumeDataBox = [[HJResumeDataBox alloc] init];
  273. }
  274. return _resumeDataBox;
  275. }
  276. - (HJSaveBasicInfoAPIManager *)saveResumeBaseInfoAPIManager {
  277. if (_saveResumeBaseInfoAPIManager == nil)
  278. {
  279. _saveResumeBaseInfoAPIManager = [[HJSaveBasicInfoAPIManager alloc] init];
  280. _saveResumeBaseInfoAPIManager.APIManagerDelegate = self;
  281. }
  282. return _saveResumeBaseInfoAPIManager;
  283. }
  284. - (NSArray *)yearDataSource {
  285. if (_yearDataSource == nil)
  286. {
  287. // 生成年份
  288. NSUInteger startYear = 1950;
  289. NSUInteger endYear = [[NSCalendar currentCalendar] components:NSCalendarUnitYear fromDate:[NSDate date]].year + 1;
  290. NSMutableArray *years = [NSMutableArray arrayWithCapacity:(endYear - startYear)];
  291. for (NSUInteger y = startYear; y < endYear; y++)
  292. {
  293. [years addObject:[NSString stringWithFormat:@"%@", @(y)]];
  294. }
  295. _yearDataSource = [years copy];
  296. }
  297. return _yearDataSource;
  298. }
  299. - (HJLabelTextFieldView *)headerView {
  300. if (_headerView == nil)
  301. {
  302. _headerView = [[HJLabelTextFieldView alloc] init];
  303. _headerView.titleLabel.text = @"头像";
  304. _headerView.contentTextField.hidden = YES;
  305. _headerView.contentImageV.hidden = NO;
  306. _headerView.contentImageV.userInteractionEnabled = YES;
  307. _headerView.contentImageV.layer.cornerRadius = 25;
  308. [_headerView.contentImageV sd_setImageWithURL:self.resumeDataBox.resume[kHJResumeKeyPortrait] placeholderImage:[UIImage imageNamed:@"me_portrait_default"]];
  309. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(photoButtonClicked)];
  310. [_headerView.contentImageV addGestureRecognizer:tap];
  311. }
  312. return _headerView;
  313. }
  314. - (HJLabelTextFieldView *)nameView {
  315. if (_nameView == nil)
  316. {
  317. _nameView = [[HJLabelTextFieldView alloc] init];
  318. _nameView.titleLabel.text = @"姓名";
  319. _nameView.hiddenRightImageV = YES;
  320. _nameView.contentTextField.placeholder = @"请输入姓名";
  321. _nameView.contentTextField.text = self.resumeDataBox.resume[kHJResumeKeyName];
  322. _nameView.contentTextField.maxLength = 30;
  323. }
  324. return _nameView;
  325. }
  326. - (HJLabelTextFieldView *)sexView {
  327. if (_sexView == nil)
  328. {
  329. _sexView = [[HJLabelTextFieldView alloc] init];
  330. _sexView.titleLabel.text = @"性别";
  331. _sexView.contentTextField.text = self.resumeDataBox.resume[kHJResumeKeyGender];
  332. _sexView.contentTextField.userInteractionEnabled = NO;
  333. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(sexSelextClicked)];
  334. [_sexView addGestureRecognizer:tap];
  335. }
  336. return _sexView;
  337. }
  338. - (HJLabelTextFieldView *)phoneView {
  339. if (_phoneView == nil)
  340. {
  341. _phoneView = [[HJLabelTextFieldView alloc] init];
  342. _phoneView.titleLabel.text = @"手机号码";
  343. _phoneView.hiddenRightImageV = YES;
  344. _phoneView.contentTextField.placeholder = @"请输入手机号码";
  345. _phoneView.contentTextField.keyboardType = UIKeyboardTypeNumberPad;
  346. _phoneView.contentTextField.text = self.resumeDataBox.resume[kHJResumeKeyPhone];
  347. }
  348. return _phoneView;
  349. }
  350. - (HJLabelTextFieldView *)yearView {
  351. if (_yearView == nil)
  352. {
  353. _yearView = [[HJLabelTextFieldView alloc] init];
  354. _yearView.titleLabel.text = @"出生年份";
  355. _yearView.contentTextField.userInteractionEnabled = NO;
  356. _yearView.contentTextField.text = self.resumeDataBox.resume[kHJResumeKeyBirthYear];
  357. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(yearSelextClicked)];
  358. [_yearView addGestureRecognizer:tap];
  359. }
  360. return _yearView;
  361. }
  362. - (HJLabelTextFieldView *)educationView {
  363. if (_educationView == nil)
  364. {
  365. _educationView = [[HJLabelTextFieldView alloc] init];
  366. _educationView.titleLabel.text = @"最高学历";
  367. _educationView.contentTextField.userInteractionEnabled = NO;
  368. _educationView.contentTextField.text = self.resumeDataBox.resume[kHJResumeKeyEducation];
  369. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(educationSelextClicked)];
  370. [_educationView addGestureRecognizer:tap];
  371. }
  372. return _educationView;
  373. }
  374. - (HJLabelTextFieldView *)WeChatView {
  375. if (_WeChatView == nil)
  376. {
  377. _WeChatView = [[HJLabelTextFieldView alloc] init];
  378. _WeChatView.titleLabel.text = @"微信账号";
  379. _WeChatView.hiddenRightImageV = YES;
  380. _WeChatView.contentTextField.placeholder = @"请输入微信账号";
  381. _WeChatView.contentTextField.text = self.resumeDataBox.resume[kHJResumeKeyWechat];
  382. }
  383. return _WeChatView;
  384. }
  385. - (UIButton *)saveButton {
  386. if (_saveButton == nil)
  387. {
  388. _saveButton = [UIButton buttonWithType:UIButtonTypeCustom];
  389. [_saveButton setTitle:@"保存" forState:UIControlStateNormal];
  390. _saveButton.titleLabel.font = [UIFont systemFontOfSize:18];
  391. _saveButton.layer.cornerRadius = 5;
  392. _saveButton.layer.masksToBounds = YES;
  393. _saveButton.backgroundColor = COLOR_0177FF;
  394. [_saveButton addTarget:self action:@selector(saveButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
  395. }
  396. return _saveButton;
  397. }
  398. - (FBScrollLayoutView *)scrollLayoutView {
  399. if (_scrollLayoutView == nil)
  400. {
  401. _scrollLayoutView = [[FBScrollLayoutView alloc] init];
  402. _scrollLayoutView.delegate = self;
  403. _scrollLayoutView.backgroundColor = COLOR_F5F5F5;
  404. _scrollLayoutView.contentView.backgroundColor = COLOR_F5F5F5;
  405. }
  406. return _scrollLayoutView;
  407. }
  408. @end