Tôi muốn các văn bản trong một UITextField
(hoặc lý tưởng, một UILabel
) là không thể chỉnh sửa, nhưng đồng thời cung cấp cho người dùng khả năng để sao chép nó để dán ở nơi khác.Enable sao chép và dán trên UITextField mà không làm cho nó có thể chỉnh sửa
Trả lời
giải pháp cuối cùng của tôi là như sau:
Tôi tạo ra một lớp con của UILabel (UITextField nên làm việc giống nhau) mà hiển thị một UIMenuController sau khi được khai thác. CopyableLabel.m trông như thế này:
@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
Thay vào đó hãy thử UITextView
(Tôi nghi ngờ nó sẽ hoạt động như một số UILabel
cho bạn). Tôi đã thử nghiệm tính năng này với thuộc tính editable
được đặt thành NO
và tính năng nhấn đúp để sao chép đã hoạt động đối với tôi.
Tôi sẽ nghi ngờ rằng với trường không thể chỉnh sửa, sẽ không có nút dán nào xuất hiện. Hãy cho chúng tôi biết nếu đó là sự thật. – wkw
Câu hỏi ban đầu không được viết rõ ràng, sau đó. Tôi đọc "khả năng sao chép và dán" có nghĩa là dán nó ở một nơi khác. Đọc nó theo cách khác, làm thế nào bạn có thể dán một cái gì đó vào một widget UI * không * có thể chỉnh sửa được? Tôi không nghĩ rằng một widget như vậy tồn tại. –
Một giải pháp khác là giữ UITextField
kích hoạt nhưng lập trình ngăn ngừa nó khỏi bị chỉnh sửa. Này được thực hiện với phương pháp đại biểu sau đây:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
return NO;
}
Tôi không nhận thức được những hạn chế có thể mặc dù, hiện nay phù hợp với nhu cầu của tôi.
Câu hỏi này khá cũ và tôi ngạc nhiên không ai đã đăng giải pháp mà không có phân lớp phụ. Ý tưởng được trình bày trong câu trả lời của @ mrueg là chính xác, nhưng bạn không cần phải phân lớp bất kỳ thứ gì. Tôi chỉ tình cờ gặp vấn đề này và giải quyết nó như thế này:
Trong điều khiển quan điểm của tôi:
- (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;
}
Nếu bạn muốn làm công việc này cho một UILabel
, cần làm việc theo cách tương tự với chỉ cần thêm một vòi nước công cụ nhận dạng cử chỉ thay vì sử dụng phương thức ủy nhiệm.
Mã sau đã lưu tôi.
textField.addTarget(target, action: "textFieldEditingDidEndAction:", forControlEvents: [.EditingDidEnd])
Có vẻ như Paste
là sự kiện chỉnh sửa đơn và đầy đủ.
Điều này sẽ làm mọi thứ bạn cần. Sẽ có thể sao chép được. Nhưng không thể chỉnh sửa và sẽ không hiển thị bàn phím hoặc con trỏ.
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
}
}
Tôi vẫn có thể chỉnh sửa trường văn bản ngay cả sau khi thử mã số –
@palebone xin lỗi , Tôi quên để chỉ ra rằng bạn cần phải làm cho ViewController đại biểu cho copyableUneditableTextfield. Tôi đã cập nhật mã, thêm dòng đó. – Harris
Tôi nghĩ rằng tôi đã thử điều đó, nó dễ dàng hơn nhiều để chỉ sử dụng một uitexview và làm cho nó tương tác nhưng không thể chỉnh sửa –
- 1. có ký tự Unicode cho Sao chép và Dán không?
- 2. Cách triển khai menu "Chỉnh sửa" với "Hoàn tác", "Cắt", "Dán" và "Sao chép"?
- 3. Vim sao chép và dán
- 4. Vim: cách chọn khu vực chỉnh sửa và sao chép/dán
- 5. UITextField: không thể nhập văn bản nhưng biểu tượng mặt cười, sao chép/dán và backspace là tốt
- 6. Khi sử dụng ma thuật% dán trong ipython, làm cách nào để tôi có thể dán mã được sao chép, thay vì dán và thực thi để có thể chỉnh sửa
- 7. Sao chép/Dán trong JavaScript?
- 8. Chỉnh sửa dữ liệu clipboard khi sao chép/dán từ một trang web
- 9. Có thể 'sao chép và dán' toàn bộ ứng dụng Rails không?
- 10. Sao chép và Dán Android với TextView
- 11. Điểm sao chép-dán Xcode
- 12. Làm cách nào để sao chép và dán hoặc sao chép dự án hiện tại?
- 13. Có cách nào để thiết lập Haskell trên Windows mà không cần cài đặt không? (Sao chép + dán)
- 14. Chức năng UITextField không có bàn phím
- 15. Có thể kích hoạt plugin jQuery Autocomplete trên "dán" không?
- 16. Bản địa hóa menu Cắt | Sao chép | Dán trên iOS
- 17. TinyMCE và nhập/sao chép dán từ Microsoft Word
- 18. Người dùng có thể chỉnh sửa sổ ghi chép trên máy chủ sổ ghi chép công cộng không?
- 19. ios UITextField để chỉnh sửa với uidatepicker
- 20. Cách chuyển đổi UILabel giữa có thể chỉnh sửa và không thể chỉnh sửa
- 21. một hàm thay vì chương trình sao chép và dán
- 22. Hiển thị trình đơn dán cắt dán iPhone trên UILabel
- 23. Làm cách nào để sao chép tệp lớn trên Windows mà không có CopyFile hoặc CopyFileEx?
- 24. Sao chép dán không hoạt động trong webIDE nitrous?
- 25. Làm thế nào tôi có thể sao chép bitmap sang bitmap khác mà không cần sử dụng createBitmap() và sao chép() trên Android?
- 26. Làm cách nào để tùy chỉnh hành vi sao chép/dán trong Visual Studio 2008?
- 27. Chức năng sao chép/dán trong UITableViewController
- 28. sao chép và dán hình ảnh trong Edittext
- 29. Django admin: làm cho có thể chỉnh sửa trong lĩnh vực add nhưng không thể chỉnh sửa
- 30. hàng có thể chỉnh sửa và không thể chỉnh sửa trong slickgrid
phương pháp này dường như không hoạt động khi được sử dụng bên trong một tableViewController, nhưng bạn có thể làm cho nó hoạt động nếu bạn thêm điều này trong khung nhìn của bạn đã tải 'UITapGestureRecognizer * tgr = [[UITapGestureRecognizer alloc] initWithTarget: self.yourCopyableLabel action: @selector (tapDetected) ]; [tự.xem addGestureRecognizer: tgr]; 'sau đó thay đổi' - (void) touchesEnded: (NSSet *) chạm với sự kiệnEvent: (UIEvent *)' trong việc thực thi copyableLabel thành '- (void) tapDetected' và nó sẽ hoạt động – Fonix
cũng thêm 'UITapGestureRecogniser' đến một ô cụ thể nếu bạn có thể, cách tôi đã đề cập ở trên làm cho menu bật lên nếu bạn nhấp vào bất kỳ vị trí nào trên màn hình mà không phải là mục có thể nhấp – Fonix