本人在網上看到的大部分關於自定義剪貼板的文章,按照文章上的方法操做,點擊複製時,鍵盤總會退出,對此經歷了百般折磨.終於在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; }