// // LMJTextViewController.m // PLMMPRJK // // Created by windshan on 2017/4/26. // Copyright © 2017年 GoMePrjk. All rights reserved. // #import "LMJTextViewController.h" #import "IQUIView+Hierarchy.h" #import "IQKeyboardManager.h" #import "IQKeyboardReturnKeyHandler.h" @interface LMJTextViewController () /** <#digest#> */ @property (nonatomic, strong) NSArray *requiredTextFields; /** <#digest#> */ @property (nonatomic, strong) IQKeyboardReturnKeyHandler *returnKeyHandler; @end @implementation LMJTextViewController - (void)viewDidLoad { [super viewDidLoad]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self initKeyboard]; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.view endEditing:YES]; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; if (_returnKeyHandler) { [_returnKeyHandler setDelegate:nil]; _returnKeyHandler = nil; } } #pragma mark - UITextViewDelegate, UITextFieldDelegate #pragma mark - 处理 returnKey - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (![IQKeyboardManager sharedManager].canGoNext) { [self textViewController:self inputViewDone:textField]; } return YES; } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { if (![IQKeyboardManager sharedManager].canGoNext && [text isEqualToString:@"\n"]) { [self textViewController:self inputViewDone:textView]; } return YES; } #pragma mark - LMJTextViewControllerDelegate - (void)textViewController:(LMJTextViewController *)textViewController inputViewDone:(id)inputView { NSLog(@"%@, %@", self.requiredTextFields, inputView); } #pragma mark - autoEmpty - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // 九宫格 bug fix if ([@"➋➌➍➎➏➐➑➒" rangeOfString:string].location != NSNotFound) { return YES; } NSString *current = [textField.text stringByReplacingCharactersInRange:range withString:string.stringByTrim].stringByTrim; if (textField.isEmptyAutoEnable && (TWIsEmpty(textField.text.stringByTrim) || TWIsEmpty(current))) { if (TWIsEmpty(current)) { [self checkIsEmpty:YES textField:textField]; }else { [self checkIsEmpty:NO textField:textField]; } } return YES; } - (BOOL)textFieldShouldClear:(UITextField *)textField { if (textField.isEmptyAutoEnable) { [self checkIsEmpty:YES textField:textField]; } return YES; } #pragma mark - 设置 btn的 enable - (void)checkIsEmpty:(BOOL)isEmpty textField:(UITextField *)textField { if (TWIsEmpty(self.requiredTextFields)) { return; } if ([self respondsToSelector:@selector(textViewControllerRelationButtons:)]) { if (TWIsEmpty([self textViewControllerRelationButtons:self])) { return; } }else { return; } __block BOOL isButtonEnabled = !isEmpty; if (!isEmpty) { [self.requiredTextFields enumerateObjectsUsingBlock:^(UITextField *obj, NSUInteger idx, BOOL * _Nonnull stop) { if (obj != textField && TWIsEmpty(obj.text.stringByTrim)) { isButtonEnabled = NO; *stop = YES; } }]; } [[self textViewControllerRelationButtons:self] enumerateObjectsUsingBlock:^(UIButton * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { obj.enabled = isButtonEnabled; }]; } #pragma mark - 初始化 - (void)initKeyboard { // 键盘 IQKeyboardManager *manager = [IQKeyboardManager sharedManager]; manager.enable = YES; manager.shouldResignOnTouchOutside = YES; manager.shouldToolbarUsesTextFieldTintColor = YES; manager.enableAutoToolbar = [self textViewControllerEnableAutoToolbar:self]; manager.shouldPlayInputClicks = YES; manager.shouldShowToolbarPlaceholder = YES; [self requiredTextFields]; [self initReturnKeyHandler];; } #pragma mark - LMJTextViewControllerDataSource - (BOOL)textViewControllerEnableAutoToolbar:(LMJTextViewController *)textViewController { return YES; } - (UIReturnKeyType)textViewControllerLastReturnKeyType:(LMJTextViewController *)textViewController { return UIReturnKeyDone; } - (NSArray *)requiredTextFields { if(_requiredTextFields == nil) { NSArray *responsedInputViews = [self.view deepResponderViews]; NSMutableArray *array = [NSMutableArray array]; [responsedInputViews enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[UITextField class]]) { UITextField *field = (UITextField *)obj; field.delegate = self; if (field.isEmptyAutoEnable) { [array addObject:field]; } } if ([obj isKindOfClass:[UITextView class]]) { UITextView *textView = (UITextView *)obj; textView.delegate = self; } }]; _requiredTextFields = array; } return _requiredTextFields; } - (void)initReturnKeyHandler { if(_returnKeyHandler == nil) { _returnKeyHandler = [[IQKeyboardReturnKeyHandler alloc] initWithViewController:self]; _returnKeyHandler.delegate = self; _returnKeyHandler.lastTextFieldReturnKeyType = [self textViewControllerLastReturnKeyType:self]; } } - (void)dealloc { _returnKeyHandler = nil; } @end #pragma mark - LMJTextViewControllerTextField static void *isEmptyAutoEnableKey = &isEmptyAutoEnableKey; @implementation UITextField (LMJTextViewController) - (void)setIsEmptyAutoEnable:(BOOL)isEmptyAutoEnable { [self setAssociateValue:@(isEmptyAutoEnable) withKey:isEmptyAutoEnableKey]; } - (BOOL)isEmptyAutoEnable { return [(NSNumber *)[self getAssociatedValueForKey:isEmptyAutoEnableKey] boolValue]; } @end @implementation LMJTextViewControllerTextField - (NSString *)text { return ([[super text] stringByTrim]); } @end