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];
. 위의 답변은 상황을 지나치게 복잡하게 만들고 있습니다.
'IT' 카테고리의 다른 글
VS2010 프로젝트에 대한 외부 액세스를 위해 IIS Express 구성 (0) | 2020.08.16 |
---|---|
_gaq.push ([ '_ trackPageLoadTime'])는 어떻게 작동합니까? (0) | 2020.08.16 |
수정 된 줄만 표시하는 Git diff (0) | 2020.08.16 |
Java 프로젝트의 패키지 구조? (0) | 2020.08.16 |
매개 변수로 SQL 쿼리의 목록 목록 (0) | 2020.08.16 |