[ios] UITextField 편집을 비활성화하지만 여전히 터치를 허용하는 방법은 무엇입니까?

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

setEnabled또는 setUserInteractionEnabled을 설정 하여 편집을 비활성화 할 수 있음을 배웠습니다 NO. 좋습니다.하지만 TextField가 터치에 응답하지 않고 선택기가 표시되지 않습니다.

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



답변

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

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

그게 다야!


답변

신속한 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을 구현합니다.


답변

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


답변

Swift에서 :

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