2009-12-17 22 views

Trả lời

24

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 
+0

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

+0

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

2

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.

+0

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

+3

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. –

1

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.

5

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.

0

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 đủ.

0

Đ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 
    } 

} 
+0

Tôi vẫn có thể chỉnh sửa trường văn bản ngay cả sau khi thử mã số –

+0

@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

+0

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 –

Các vấn đề liên quan