2009-12-17 61 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並使其可交互但不可編輯 –