iOS開發之自定義剪貼板,在複製時,鍵盤不退出的方法

本人在網上看到的大部分關於自定義剪貼板的文章,按照文章上的方法操做,點擊複製時,鍵盤總會退出,對此經歷了百般折磨.終於在stackoverflow上找到了解決辦法.app

通常場景就像聊天界面同樣,必而後一個輸入框,和一個須要剪切板的文本,就像上圖同樣的聊天界面.
處理方法,自定義輸入框的類如:ZBMessageTextViewide

#import "ZBMessageTextView.h"

@interface ZBMessageTextView : UITextView

@property (nonatomic, weak) UIResponder *inputNextResponder;

#import "ZBMessageTextView.m"

@implementation ZBMessageTextView

- (UIResponder *)nextResponder {
    if (_inputNextResponder != nil)
        return _inputNextResponder;
    else
        return [super nextResponder];
}

在須要剪貼板的地方的長按方法以下編寫ui

1         //首先經過這兩行代碼獲取第一相應
2         UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
3         ZBMessageTextView * firstResponder = [keyWindow performSelector:@selector(firstResponder)];
4         if ([firstResponder isKindOfClass:[ZBMessageTextView class]]) {
5             firstResponder.isShowMenu = YES;
6             firstResponder.inputNextResponder = self;
7         }else{
8             [self becomeFirstResponder];
9         }

可是寫完之後出現如下問題atom

解決方法以下:spa

 1 #import "ZBMessageTextView.m"
 2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event{
 3     self.isShowMenu = NO;
 4 }
 5 - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
 6     if (self.isShowMenu) {
 7         return NO;
 8     }
 9     return  action == @selector(paste:);
10 }
11 - (void)paste:(UIMenuController *)menu
12 {
13     UIPasteboard *board = [UIPasteboard generalPasteboard];
14     if (board.string!=nil) {
15         NSRange range = self.selectedRange;
16         if(range.location == NSNotFound){
17             range.location = self.text.length;
18         }
19         BOOL append = (range.location == self.text.length)?YES:NO;
20         if (self.delegate1 && [self.delegate1 respondsToSelector:@selector(inputTextViewPaste:selectRange:isAppend:)]) {
21             [self.delegate1 inputTextViewPaste:board.string selectRange:self.selectedRange isAppend:append];
22         }
23     }
24 //    if (board.image) {
25 //        [self resignFirstResponder];
26 //        [[LZAlertImageView sharedAlertView] alertViewMessage:@"" cancelTitle:APPDELEGATE.lanDict[@"cancel"] sureTitle:APPDELEGATE.lanDict[@"msg_send"] image:board.image Block:^{
27 //            if (self.delegate1 && [self.delegate1 respondsToSelector:@selector(lzAlertImageEnsure:)]) {
28 //                [self.delegate1 lzAlertImageEnsure:board.image];
29 //            }
30 //        }];
31 //    }else{
32 ////        NSString *currentStr = self.text;
33 //
34 //    }
35 }

在消息cell的。m文件上寫code

 /*
 *  根據action,判斷UIMenuController是否顯示對應aciton的title
 */
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender{
    UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
    ZBMessageTextView * firstResponder = [keyWindow performSelector:@selector(firstResponder)];
    if ([firstResponder isKindOfClass:[ZBMessageTextView class]]) {//關鍵代碼
        if (firstResponder.isShowMenu == NO) {
            return NO;
        }
    }
    if (action == @selector(doCopy) || action==@selector(doShare) || action==@selector(doCollector)|| action==@selector(doCompose) || action == @selector(doForward) || action == @selector(doMutiSelect) || action == @selector(doWithDraw) || action == @selector(doDelete)) {
        return YES;
    }
    return NO;
}
相關文章
相關標籤/搜索