2009-12-17 60 views

回答

24

我的最终解决方案是以下几点:

我创建的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 
+0

这个方法在tableViewController中使用时似乎不起作用,但是如果你在你的视图中添加了这个方法,它就可以工作了。UITapGestureRecognizer * tgr = [[UITapGestureRecognizer alloc] initWithTarget:self.yourCopyableLabel action:@selector(tapDetected) ]。 [self。然后在copyableLabel实现中更改' - (void)touchesEnded:(NSSet *)与事件:(UIEvent *)事件'到' - (void)tapDetected'并且它应该工作 – Fonix

+0

也添加了'UITapGestureRecogniser'到特定的单元格,如果可以的话,我上面提到的方式使得菜单弹出如果你点击屏幕上的任何一个不是可点击的项目 – Fonix

2

尝试UITextView改为(我怀疑它会像你的UILabel一样)。我测试了它的editable属性设置为NO,并为我工作了双击 - 复制。

+0

我会怀疑,虽然与字段不可编辑,不会出现粘贴按钮。让我们知道如果这是真的。 – wkw

+3

原来的问题没有写的清楚,那么。我读“复制和粘贴的能力”来表示将它粘贴到其他地方。以另一种方式阅读它,你怎么可能将某些东西粘贴到*不可编辑的UI小部件中?我不认为这样的小部件存在。 –

1

另一种解决方案是保持启用UITextField但编程防止它被编辑。这与以下委托方法实现:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    return NO; 
} 

我不知道可能存在的限制,虽然,目前适合我的需要。

5

这个问题很老了,我很惊讶没有人发布没有子类化的解决方案。在@ 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,它应该工作方式相同,只需增加一个水龙头手势识别器而不是使用委托方法。

0

以下代码保存了我。

textField.addTarget(target, action: "textFieldEditingDidEndAction:", forControlEvents: [.EditingDidEnd]) 

看来Paste是一个单一,完整的编辑事件。

0

这将做你需要的一切。将可复制。但不可编辑,并且不会显示键盘或光标。

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 
    } 

} 
+0

即使在尝试你的代码后,我仍然可以编辑文本字段 –

+0

@palebone对不起,我忘了说明你需要将ViewController作为copyableUneditableTextfield的委托。我更新了代码,添加了该行。 – Harris

+0

我想我已经尝试过了,使用uitexview并使其可交互但不可编辑 –