UITextField/UITextView 展示键盘 与 UIMenu 并存方案

  • 目的:UITextField/UITextView使用时展示UIMenu (键盘不下去)

关键点1

修改 UITextField 的响应链顺序,在需要展示UIMenu时让 UITextField 的 nextResponder改成触发展示键盘的控件,在demo中就是赋值给 UIButton。

//CustomTextField/TextView's override nextResponder
- (UIResponder *)nextResponder{ //UITextField 响应链修改位置
   if (self.textFieldResponder) {
      return self.textFieldResponder;
    }
    return [super nextResponder];
}

//showMenuView Action
- (IBAction)btnClick:(UIButton *)sender {

    if (self.textField.isFirstResponder) {
      //键盘弹出时处理,监听 UIMenuControllerWillHideMenuNotification,目标是消失Menu时让TextField的响应链恢复如初
    
        self.textField.textFieldResponder = sender;
    
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(menuWillHide) name:UIMenuControllerWillHideMenuNotification object:nil];
    
    }else{
    
        [sender becomeFirstResponder];
    
    }

    //Blablabla Menu展示代码
}

关键点2

修改触发展示键盘的控件

@implementation MenuShowkeyboardControl


- (BOOL)canBecomeFirstResponder{
    return YES;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    BOOL isSame = [NSStringFromSelector(action) isEqualToString:NSStringFromSelector(@selector(cut:))];
    NSLog(@"MenuShowkeyboardControl-\n-isSame->%d--\n,action-> %@,",isSame,NSStringFromSelector(action));
    return isSame;
}


- (void)cut:(id)sender{
    NSLog(@"--cut--");
}

总结

1.UIMenuController这个单例控件用完每次都清空,以免其他场景业务不同不满足需求。
2.响应链顺序决定了UIMenu与键盘能否同时展示的关键。

  • GitHub地址:https://github.com/pengweijunPanda/MenuShowKeyboardTextField

你可能感兴趣的:(UITextField/UITextView 展示键盘 与 UIMenu 并存方案)