2015-02-09 25 views
7

Tôi có số UITextField mà tôi đang sử dụng UIPickerView làm inputView. Người dùng có thể chọn giá trị từ bộ chọn và giá trị đã chọn được điền vào số TextInput của tôi.
Sắp xếp này hoạt động tốt, nhưng với các vấn đề sau:Tắt con trỏ và sao chép/dán trong UITextView (nhanh)

1) Tôi muốn tắt con trỏ vẫn hiển thị trong UITextField.
Tôi đã thử vô hiệu hóa UITextField, nhưng sau đó nó không phản ứng với các chạm và sau đó UIPickerView không hiển thị - điều này làm cho nó vô ích.
2) Vì trình chọn được hiển thị và bàn phím không được người dùng nhấn vào trường văn bản, người dùng không thể nhập bất kỳ thứ gì, nhưng vẫn có thể dán văn bản được sao chép từ người khác khi nhấn lâu. Làm thế nào tôi có thể vô hiệu hóa điều này?

Tôi không thể tìm thấy thông tin có liên quan trực tuyến. Tôi có nên sử dụng số Label hoặc Button cho điều này thay vì UITextInput không?

Trả lời

6

Tôi nghĩ một cách dễ dàng là để làm cho nó với một nút thay vì UITextField

Xin lỗi - đây không phải là dành cho Swift nó cho Obj-C nhưng đây là ý tưởng:

Để làm những gì bạn muốn với UITextField bạn phải phân lớp các UITextField và cố gắng sử dụng mã này để vô hiệu hóa/hide caret và đầu vào (copy/paste)

- (CGRect) caretRectForPosition:(UITextPosition*) position 
{ 
    return CGRectZero; 
} 

- (NSArray *)selectionRectsForRange:(UITextRange *)range 
{ 
    return nil; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:)) 
    { 
     returnNO; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 

dụ từ đây: http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

Dù sao ... đây là một "chức năng" dụ: https://github.com/hackiftekhar/IQDropDownTextField

+0

Đây là một giải pháp tuyệt vời cho bất kỳ ai cố gắng giữ cho tính năng dataDetectorTypes một cách chính xác mà không cho phép người dùng chọn (tức là sao chép, chọn tất cả, tra cứu) phần còn lại của văn bản xung quanh dữ liệu có thể thao tác. Cảm ơn @TonyMkenu –

0

Số UITextField đại biểu có thể triển khai phương thức textFieldShouldBeginEditing. Nếu phương thức đó luôn trả về NO thì con trỏ sẽ không bao giờ xuất hiện và báo chí dài sẽ không được phép.

Khi phương thức được gọi, bạn có thể hiển thị UIPickerView. Tuy nhiên, UIPickerView không thể là inputView. Nó sẽ cần phải là con của một tiêu chuẩn UIView mà bạn tạo hiệu ứng động từ phía dưới. Hoặc bạn chỉ có thể sử dụng thuộc tính hidden của UIView để ẩn/hiển thị chế độ xem nếu cần.

+0

tôi nhìn thấy, vì vậy cách tiếp cận của tôi về sử dụng 'UIPickerView' như 'inputView' cho môi trường' UITextView' là sai. Bạn có thể chỉ cho tôi một ví dụ, hoặc một cái gì đó tương tự để làm điều đó đúng cách? – rgamber

+0

Vâng, điều đó trở nên có vấn đề, bởi vì tôi vẫn sử dụng mục tiêu-C và tôi tránh bố cục tự động bất cứ khi nào có thể, vì vậy tôi có thể trợ giúp với các khái niệm, nhưng không quá nhiều với mã. – user3386109

7

Giống như TonyMkenu nói, bạn cần phải phân lớp UITextField và sau đó thực hiện các phương pháp ông đã ở trên. Đây là Swift cho những người bạn của những người không biết Objective C:

override func caretRectForPosition(position: UITextPosition!) -> CGRect { 
    return CGRect.zeroRect 
} 

override func selectionRectsForRange(range: UITextRange) -> [AnyObject] { 
    return [] 
} 

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { 
    // Disable copy, select all, paste 
    if action == Selector("copy:") || action == Selector("selectAll:") || action == Selector("paste:") { 
     return false 
    } 
    // Default 
    return super.canPerformAction(action, withSender: sender) 
} 
1

Hoàn toàn ngớ ngẩn hack, nhưng nếu bạn thiết lập màu sắc thái của trường text trong phần UIView của thanh tra sở hữu giao diện Builder để phù hợp với màu nền , con trỏ sẽ xuất hiện vô hình:

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