我在 UITableViewCell 中有一个 UITextView 。我希望 UITextView 可以选择但不是文本。当 Menu Controller 出现并且我想执行复制操作时,复制其中的所有文本而不仅仅是一部分。
我想要类似信使应用的东西:
目前我有:
提前感谢您!
Best Answer-推荐答案 strong>
事实上,这并不容易,因为在路上会出现一些奇怪的东西,但我设法创建了一个自定义的。
步骤如下:
- 创建
UITextView 的子类
- 覆盖
canPerformAction:
withSender: 用于过滤菜单的默认操作
弹出。
- 配置
textView 以便无法编辑或
选择。
- 编辑
UIMenuController 项,提供菜单上的操作和按钮
- 为每个
UIMenuItem ****添加不同的选择器(那是因为选择器的发送者不是UIMenuItem ,而是UIMenuController 这导致了另一件事。查看 here 了解更多信息。我的 gist)
代码
废话不多说,代码如下:
EBCustomTextView.h
//
// EBCustomTextView.h
// TestProject
//
// Created by Erid Bardhaj on 3/8/16.
// Copyright © 2016 Erid Bardhaj. All rights reserved.
//
#import <UIKit/UIKit.h>
typedef NS_ENUM(NSInteger, EBCustomTextViewMenuAction) {
EBCustomTextViewMenuActionCopy,
EBCustomTextViewMenuActionDefine,
EBCustomTextViewMenuActionRead
};
@class EBCustomTextView;
@protocol EBCustomTextViewMenuActionDelegate <NSObject>
- (void)customTextViewEBCustomTextView *)textView didSelectMenuActionEBCustomTextViewMenuAction)action;
@end
@interface EBCustomTextView : UITextView
@property (weak, nonatomic) id<EBCustomTextViewMenuActionDelegate> menuActionDelegate;
@end
EBCustomTextView.m
//
// EBCustomTextView.m
// TestProject
//
// Created by Erid Bardhaj on 3/8/16.
// Copyright © 2016 Erid Bardhaj. All rights reserved.
//
#import "EBCustomTextView.h"
@implementation EBCustomTextView {
EBCustomTextViewMenuAction currentAction;
}
- (void)awakeFromNib {
[super awakeFromNib];
// Configure the textView
self.editable = NO;
self.selectable = NO;
}
#pragma mark - Datasource
- (NSArray *)items {
UIMenuItem *item = [[UIMenuItem alloc] initWithTitle"Copy" actionselector(copyMenuItemPressed)];
UIMenuItem *item1 = [[UIMenuItem alloc] initWithTitle"Define" actionselector(defineMenuItemPressed)];
UIMenuItem *item2 = [[UIMenuItem alloc] initWithTitle"Read" actionselector(readMenuItemPressed)];
return @[item, item1, item2];
}
#pragma mark - Actions
- (void)copyMenuItemPressed {
if ([self.menuActionDelegate respondsToSelectorselector(customTextView:didSelectMenuAction]) {
[self.menuActionDelegate customTextView:self didSelectMenuAction:EBCustomTextViewMenuActionCopy];
}
}
- (void)defineMenuItemPressed {
if ([self.menuActionDelegate respondsToSelectorselector(customTextView:didSelectMenuAction]) {
[self.menuActionDelegate customTextView:self didSelectMenuAction:EBCustomTextViewMenuActionDefine];
}
}
- (void)readMenuItemPressed {
if ([self.menuActionDelegate respondsToSelectorselector(customTextView:didSelectMenuAction]) {
[self.menuActionDelegate customTextView:self didSelectMenuAction:EBCustomTextViewMenuActionRead];
}
}
#pragma mark - Private
- (void)menuItemPressedAtIndexNSInteger)index {
currentAction = index;
if ([self.menuActionDelegate respondsToSelectorselector(customTextView:didSelectMenuAction]) {
[self.menuActionDelegate customTextView:self didSelectMenuAction:currentAction];
}
}
#pragma mark Helpers
- (void)showMenuController {
UIMenuController *theMenu = [UIMenuController sharedMenuController];
theMenu.menuItems = [self items];
[theMenu update];
CGRect selectionRect = CGRectMake (0, 0, self.contentSize.width, self.contentSize.height);
[theMenu setTargetRect:selectionRect inView:self];
[theMenu setMenuVisibletheMenu.isMenuVisible) ? NO : YES animated:YES];
}
#pragma mark - Overridings
- (BOOL)canPerformActionSEL)action withSenderid)sender {
// Filter any action for this textView except our custom ones
if (action == @selector(copyMenuItemPressed) || action == @selector(defineMenuItemPressed) || action == @selector(readMenuItemPressed)) {
return YES;
}
return NO;
}
- (void)touchesEndedNSSet *)touches withEventUIEvent *)event {
UITouch *theTouch = [touches anyObject];
if ([theTouch tapCount] == 1 && [self becomeFirstResponder]) {
[self showMenuController];
}
}
@end
实现
将你的 textView 的类设置为 EBCustomTextView 并符合 EBCustomTextViewMenuActionDelegate
界面
@interface ViewController () <EBCustomTextViewMenuActionDelegate>
viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.textView.menuActionDelegate = self;
}
协议(protocol)一致性
#pragma mark - Delegation
#pragma mark EBCustomTextViewMenuActionDelegate
- (void)customTextViewEBCustomTextView *)textView didSelectMenuActionEBCustomTextViewMenuAction)action {
switch (action) {
case EBCustomTextViewMenuActionCopy:
NSLog(@"Copy Action");
break;
case EBCustomTextViewMenuActionRead:
NSLog(@"Read Action");
break;
case EBCustomTextViewMenuActionDefine:
NSLog(@"Define Action");
break;
default:
break;
}
}
输出
享受
关于ios - 选择一个 textView 里面没有选择文本?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/35865135/
|