답변:
텍스트 필드 대리자를 사용하는 방법이 있습니다.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
여기서 NO를 반환하면 사용자가 텍스트를 편집하려는 모든 시도가 거부됩니다.
이렇게하면 필드를 활성화 된 상태로 둘 수 있지만 여전히 사람들이 텍스트를 붙여 넣는 것을 방지 할 수 있습니다.
Nick 의 대답 을 신속하게 번역하십시오 .
P / S : false => 텍스트 필드를 입력 할 수 없으며 키보드로 편집 할 수 없습니다. code.EX로 텍스트를 설정할 수 있습니다. textField.text = "My String Here"
override func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return false
}
이것은 가장 간단합니다.
in viewDidLoad :( 편집 불가능한 텍스트 필드에 대해서만 대리자를 설정합니다.
self.textfield.delegate=self;
다음 대리자 함수를 삽입하십시오.
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return NO;
}
그게 다야!
UIPickerView
해당 대리자 메서드에서 동작 을 트리거하면 잘 작동합니다.
신속한 3+ :
class MyViewController: UIViewController, UITextFieldDelegate {
override func viewDidLoad() {
self.myTextField.delegate = self
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
if textField == myTextField {
// code which you want to execute when the user touch myTextField
}
return false
}
}
의 사용자 지정 하위 클래스 만들기 위해 더 우아한 것 UITextField
그 반환 NO
모든 통화를 canPerformAction:withSender:
(여기서 또는 적어도 action
이다 @selector(cut)
나 @selector(paste)
)와 같이, 여기 .
또한 Bluetooth 키보드에서 텍스트 입력을 비활성화하기 위해 Nick의 제안에 따라 (BOOL) textField : (UITextField *) textField shouldChangeCharactersInRange : (NSRange) range replacementString : (NSString *) string을 구현합니다.
canPerformAction
및 shouldChangeCharactersInRange
메서드는 호출되지 않습니다.
MrMage에서 제공하는 솔루션을 사용했습니다. 내가 추가 할 유일한 것은 UITextView를 첫 번째 응답자로 사임해야한다는 것입니다. 그렇지 않으면 선택한 텍스트에 갇혀 있습니다.
내 빠른 코드는 다음과 같습니다.
class TouchableTextView : UITextView {
override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
self.resignFirstResponder()
return false
}
override func shouldChangeTextInRange(range: UITextRange, replacementText text: String) -> Bool {
self.resignFirstResponder()
return false
}
}
UIPickerView 및 Action Sheets를 처리하는 대안은 ActionSheetPicker를 확인하십시오.
https://github.com/TimCinel/ActionSheetPicker
코코아 포드가 활성화되었습니다. 작업 시트의 모든 취소 및 완료 버튼을 처리합니다. 샘플 프로젝트의 예제는 훌륭합니다. String 기반 옵션 만 쉽게 처리하는 ActionSheetStringPicker를 선택하지만 API는 내가 생각할 수있는 대부분의 모든 것을 처리 할 수 있습니다.
나는 원래 체크 표시가 된 답변과 매우 유사한 솔루션을 시작했지만이 프로젝트를 우연히 발견하고 cocopods 사용을 포함하여 사용하기 위해 내 앱에 통합하는 데 약 20 분이 걸렸습니다 : ActionSheetPicker (~> 0.0)
도움이 되었기를 바랍니다.
git 프로젝트를 다운로드하고 다음 클래스를 살펴보십시오.
여기에 내가 추가 한 거의 대부분의 코드와 * .h 가져 오기가 있습니다.
- (IBAction)gymTouched:(id)sender {
NSLog(@"gym touched");
[ActionSheetStringPicker showPickerWithTitle:@"Select a Gym" rows:self.locations initialSelection:self.selectedIndex target:self successAction:@selector(gymWasSelected:element:) cancelAction:@selector(actionPickerCancelled:) origin:sender];
}
- (void)actionPickerCancelled:(id)sender {
NSLog(@"Delegate has been informed that ActionSheetPicker was cancelled");
}
- (void)gymWasSelected:(NSNumber *)selectedIndex element:(id)element {
self.selectedIndex = [selectedIndex intValue];
//may have originated from textField or barButtonItem, use an IBOutlet instead of element
self.txtGym.text = [self.locations objectAtIndex:self.selectedIndex];
}
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
return NO; // Hide both keyboard and blinking cursor.
}
값을 선택하기 위해 UIPickerView를 사용하는 동안 UITextField의 편집을 방지하려면 (Swift에서) :
self.txtTransDate = self.makeTextField(self.transDate, placeHolder: "Specify Date")
self.txtTransDate?.addTarget(self, action: "txtTransDateEditing:", forControlEvents: UIControlEvents.EditingDidBegin)
func makeTextField(text: String?, placeHolder: String) -> UITextField {
var textField = UITextField(frame: CGRect(x: 140, y: 0, width: 220.00, height: 40.00));
textField.placeholder = placeHolder
textField.text = text
textField.borderStyle = UITextBorderStyle.Line
textField.secureTextEntry = false;
textField.delegate = self
return textField
}
func txtTransDateEditing(sender: UITextField) {
var datePickerView:UIDatePicker = UIDatePicker()
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}
func datePickerValueChanged(sender: UIDatePicker) {
var dateformatter = NSDateFormatter()
dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
self.txtTransDate!.text = dateformatter.stringFromDate(sender.date)
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
self.resignFirstResponder()
return false
}
이 해결 방법이 작동합니다. 텍스트 필드 위에 투명한 UIView를 배치하고 다음 코드를 구현합니다.
- (void)viewDidLoad
{
[super viewDidLoad];
UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
[transparentView addGestureRecognizer:press];
[press release];
press = nil;
}
-(void)longPress
{
txtField.userInteractionEnabled = NO;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
txtField.userInteractionEnabled = YES;
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[txtField becomeFirstResponder];
}
이것은 나를 위해 일했습니다
[textview setEditable:NO];
. 위의 답변은 상황을 지나치게 복잡하게 만들고 있습니다.