我想在UITextField
文本(或理想情况下,UILabel
)是不可编辑,但同时使用户能够复制粘贴功能别处。启用复制和上的UITextField粘贴没有使它可编辑
回答
我的最终解决方案是以下几点:
我创建的UILabel的一个子类(的UITextField应该工作一样),显示被挖掘出来后,UIMenuController。 CopyableLabel.m看起来是这样的:
@implementation CopyableLabel
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if(action == @selector(copy:)) {
return YES;
}
else {
return [super canPerformAction:action withSender:sender];
}
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (BOOL)becomeFirstResponder {
if([super becomeFirstResponder]) {
self.highlighted = YES;
return YES;
}
return NO;
}
- (void)copy:(id)sender {
UIPasteboard *board = [UIPasteboard generalPasteboard];
[board setString:self.text];
self.highlighted = NO;
[self resignFirstResponder];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if([self isFirstResponder]) {
self.highlighted = NO;
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuVisible:NO animated:YES];
[menu update];
[self resignFirstResponder];
}
else if([self becomeFirstResponder]) {
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setTargetRect:self.bounds inView:self];
[menu setMenuVisible:YES animated:YES];
}
}
@end
尝试UITextView
改为(我怀疑它会像你的UILabel
一样)。我测试了它的editable
属性设置为NO
,并为我工作了双击 - 复制。
我会怀疑,虽然与字段不可编辑,不会出现粘贴按钮。让我们知道如果这是真的。 – wkw
原来的问题没有写的清楚,那么。我读“复制和粘贴的能力”来表示将它粘贴到其他地方。以另一种方式阅读它,你怎么可能将某些东西粘贴到*不可编辑的UI小部件中?我不认为这样的小部件存在。 –
另一种解决方案是保持启用UITextField
但编程防止它被编辑。这与以下委托方法实现:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
return NO;
}
我不知道可能存在的限制,虽然,目前适合我的需要。
这个问题很老了,我很惊讶没有人发布没有子类化的解决方案。在@ mrueg的答案中提出的想法是正确的,但你不应该需要任何子类。我只是遇到了这个问题,并解决它像这样:
在我的视图控制器:
- (void)viewDidLoad {
self.textField.delegate = self;
self.textField.text = @"Copyable, non-editable string.";
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (void)copyTextFieldContent:(id)sender {
UIPasteboard* pb = [UIPasteboard generalPasteboard];
pb.string = self.textField.text;
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
// UIKit changes the first responder after this method, so we need to show the copy menu after this method returns.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self becomeFirstResponder];
UIMenuController* menuController = [UIMenuController sharedMenuController];
UIMenuItem* copyItem = [[UIMenuItem alloc] initWithTitle:@"Copy"
action:@selector(copyTextFieldContent:)];
menuController.menuItems = @[copyItem];
CGRect selectionRect = textField.frame;
[menuController setTargetRect:selectionRect inView:self.view];
[menuController setMenuVisible:YES animated:YES];
});
return NO;
}
如果你想使这项工作的UILabel
,它应该工作方式相同,只需增加一个水龙头手势识别器而不是使用委托方法。
以下代码保存了我。
textField.addTarget(target, action: "textFieldEditingDidEndAction:", forControlEvents: [.EditingDidEnd])
看来Paste
是一个单一,完整的编辑事件。
这将做你需要的一切。将可复制。但不可编辑,并且不会显示键盘或光标。
class ViewController: UIViewController {
@IBOutlet weak var copyableUneditableTextfield: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
copyableUneditableTextfield.delegate = self
copyableUneditableTextfield.inputView = UIView() //prevents keyboard
copyableUneditableTextfield.tintColor = .clear //prevents cursor
copyableUneditableTextfield.text = "Some Text You Want User To Copy But Not Edit"
}
}
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return false //prevents editing
}
}
即使在尝试你的代码后,我仍然可以编辑文本字段 –
@palebone对不起,我忘了说明你需要将ViewController作为copyableUneditableTextfield的委托。我更新了代码,添加了该行。 – Harris
我想我已经尝试过了,使用uitexview并使其可交互但不可编辑 –
- 1. iOS9:UITextField不允许复制/粘贴
- 2. 有没有办法在devexpress xtraGrid中禁用编辑器列的复制粘贴?
- 3. 使用左边没有复制和粘贴
- 4. 编辑>使用perl/tk复制/粘贴实现
- 5. Vim的复制和粘贴
- 6. 使用C#winforms自定义复制/粘贴行为,同时允许文本编辑复制/粘贴
- 7. Vim使用鼠标复制和粘贴
- 8. 使用VBA复制和粘贴公式
- 9. 使用SpreadJS复制和粘贴
- 10. 复制和粘贴使用VBA
- 11. 使用循环宏复制和粘贴
- 12. 在Eclipse中剪切,复制和粘贴GEF编辑器
- 13. 复制和粘贴菜单的UITextField缺少一些时间
- 14. VBA复制和粘贴宏!=手动复制粘贴
- 15. 如何使用PyCharm编辑器中的选择+中间MB复制和粘贴?
- 16. 复制和粘贴与SED
- 17. 多个复制和粘贴
- 18. 复制和粘贴错误
- 19. 复制和粘贴板
- 20. Excel中复制和粘贴
- 21. 当我复制和粘贴
- 22. CoreText,复制和粘贴
- 23. 限制特定UITextfield的复制,粘贴选项
- 24. 编辑值和复制它
- 25. 复制粘贴userinput
- 26. UIWebView复制/粘贴
- 27. xcode复制/粘贴
- 28. iPhone复制/粘贴
- 29. 复制粘贴宏
- 30. 如何在iPhone中限制复制,粘贴UITextField?
这个方法在tableViewController中使用时似乎不起作用,但是如果你在你的视图中添加了这个方法,它就可以工作了。UITapGestureRecognizer * tgr = [[UITapGestureRecognizer alloc] initWithTarget:self.yourCopyableLabel action:@selector(tapDetected) ]。 [self。然后在copyableLabel实现中更改' - (void)touchesEnded:(NSSet *)与事件:(UIEvent *)事件'到' - (void)tapDetected'并且它应该工作 – Fonix
也添加了'UITapGestureRecogniser'到特定的单元格,如果可以的话,我上面提到的方式使得菜单弹出如果你点击屏幕上的任何一个不是可点击的项目 – Fonix