IT

UITextField 편집을 계속하지만 여전히 터치를 허용하는 방법은 무엇입니까?

lottoking 2020. 8. 16. 21:29
반응형

UITextField 편집을 계속하지만 여전히 터치를 허용하는 방법은 무엇입니까?


나는 같은 UITextField를 가지고 UIPickerView있습니다 inputView. 복사, 잘라 내기, 잘라 내기 및 텍스트 선택으로 편집 할 수있는 점을 제외하면 좋습니다. 선택 도구 만 텍스트 필드를 수정해야합니다.

setEnabled또는 setUserInteractionEnabled설정 하여 편집을 할 수 NO있습니다. TextField가 터치에 응답하지 않고 표시되지 않습니다.

그것을 달성하기 위해 무엇을 할 수 있습니까?


텍스트 필드 대리 튼을 사용하는 방법이 있습니다.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

여기서는 사용자가 텍스트를 편집하려는 모든 시도가 거부됩니다.

이렇게하면 필드를 활성화 된 상태로 둘 수 있습니다 여전히 사람들이 텍스트를 넣는 것을 방지 할 수 있습니다.


Nick 의 대답 을 신속하게 번역하십시오 .

P / S : false => 텍스트 필드를 입력 할 수 있지만 키보드로 편집 할 수 없습니다. code.EX로 텍스트를 접근 할 수 있습니다. textField.text = "여기에 내 문자열"

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

그게 다야!


신속한 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
   }
}

user-지정 하위의 클래스 만들기 위해 더 우아한을 구석으로 UITextField그 반환 NO모든 통화를 canPerformAction:withSender:(또는 적어도 ... 여기서 action이다 @selector(cut)@selector(paste))와 같이, 여기 .

또한 블루투스 키보드에서 텍스트 입력을하기 위해 Nick의 제안에 따라 (BOOL) textField : (UITextField *) textField shouldChangeCharactersInRange : (NSRange) range replacementString : (NSString *) 문자열을 구현합니다.


Swift에서 :

func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    questionField.resignFirstResponder();
    // Additional code here
    return false
}


레이블 텍스트없이 전체 UITextField 위에 UIButton을 정확히 배치하면 "보이지 않게"됩니다. 이 버튼은 Textfield 대신 터치를 수신하고 전송 할 수 있으며 TextField 내용은 계속 표시됩니다.


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 프로젝트를 다운로드하고 다음 클래스를 살펴보십시오.

  • ActionSheetPickerViewController.m
  • ActionSheetPickerCustomPickerDelegate.h

여기에 내가 추가 한 거의 대부분의 코드와 * .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];
}

당신의 inputView가 숨겨진 텍스트 필드로 나타나게 만드십시오. 이것은 또한 제시되고 비활성화 된 텍스트를 변경합니다.


나는 사용했다 :

[self.textField setEnabled:NO];

그리고 그것의 작동


이것은 나를 위해 일했습니다 [textview setEditable:NO];. 위의 답변은 상황을 지나치게 복잡하게 만들고 있습니다.

참고 URL : https://stackoverflow.com/questions/9116969/how-to-disable-uitextfield-editing-but-still-accept-touch

반응형