我想在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