2010-11-25 4 views
7

내 UIView에는 두 개의 UITextField가 있습니다. 한 텍스트 필드에 복사, 붙여 넣기 옵션을 제한해야합니다. 다른 제한 사항을 원하지 않습니다.특정 UITextfield에 대한 복사, 붙여 넣기 옵션을 제한합니다.

다음 코드를 사용하는 경우 두 필드 모두 복사, 붙여 넣기가 제한됩니다.

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if ([UIMenuController sharedMenuController]) 
    { 
      [UIMenuController sharedMenuController].menuVisible = NO; 
    } 
    return NO; 
} 

누구든지 내 문제를 해결할 수있는 해결책을 제공 할 수 있습니까?

+0

'userInteractionEnabled'를'NO'로 설정해 보셨습니까? 또는 UITextView 여전히 편집 할 수 있어야합니까? –

+0

@afEken 편집 가능해야한다고 생각합니다 – KingofBliss

답변

19

UITextField의 하위 클래스를 만듭니다. 서브 클래스에서,

 
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { 
    if (sel_isEqual(action, @selector(copy:))) { 
     return NO; 
    } 
    return [super canPerformAction:action withSender:sender]; 
} 

는 그런 다음에 복사 할 수 없도록하려면 필드에 대해이 서브 클래스를 사용하여 구현하고 복사 할 수있는 일에 대한 일반의 UITextField를 사용합니다. 애플

+0

괜찮습니다 ...하지만 제한된 UITextfield에 대한 메뉴 (잘라 내기, 복사, 붙여 넣기, 선택 등)를 표시하고 싶지 않습니다. –

+0

이 경우'-canPerformAction :'안에'[UIMenuController sharedMenuController] .menuVisible'을 시도해 볼 수 있습니다. 하위 클래스 내에서만 수행하면 예상대로 작동해야합니다. –

+2

모든 작업을 사용하지 않으려면 NO를 반환 할 수 있습니까? – kevboh

2

Explanantion : 응답자 클래스가 요청 된 작업 를 구현하고 그것을 하지 않는 경우는 다음 응답자를 호출하는 경우

이 메소드의 디폴트 구현은 YES 반환합니다. 서브 클래스는이 메소드를 오버라이드 (override) 해, 현재의 상태의 에 근거하는 메뉴 커멘드를 유효하게 할 수가 있습니다. 예를 들어 은 이 선택 인 경우 복사 명령을 활성화하고 붙여 넣기는 에 올바른 판지 표시 유형의 데이터가 포함되지 않은 경우 붙여 넣기 명령을 붙여 넣거나 사용하지 않도록 설정합니다.

그래서 해결책은 UITextView를 서브 클래스 화하고 올바르게 반환하는 것입니다.

More information about the method here

4

다음은 임의의 문자열 이상 1 개 문자를 붙여 넣을 수보다 방지 할 수 있습니다. 그러나 1 문자 길이의 문자열은 통과 할 수 있습니다 (어떤 사람들에게는 유용 할 수 있습니다 - 서브 클래 싱 할 필요가 없습니다).

먼저 그럼 난 텍스트보기에 완벽하게 작동 임의의 생각이 당신의 ViewController

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

    if ([string length] > 1) { 
     return NO; 
    } 
    return YES; 
}
+0

@cbdhac : 답변을 주셔서 감사합니다.하지만 일은 하나의 문자도 붙여 넣기를 원하지 않습니다. –

+0

이 코드는 1 개 이상의 문자가있는 문자열을 막지 않으며, 1 바이트 이상이 넘는 문자열을 방지합니다. 이렇게하면 사용자가 1 바이트 이상으로 유니 코드 문자를 입력하지 못하게됩니다 (예 : EMOJI 문자). –

+0

정확히 내가 필요한 것! – Theodoros80

1

에 다음 메서드를 추가 대리인에게 당신에 textField를

myTextField.delegate = self; // OR [myTextField setDelegate:self];

을 제공합니다. 텍스트 필드에서 작동하지 않는 이유는 없습니다.

제한하고 싶었던 텍스트 필드에 다음을 추가했습니다.

  • 길게 누름 제스처 인식기 (1 터치)
  • 길게 누름 제스처 인식기 (2 터치)
  • 탭 제스처 인식기 (2 개 탭, 1 터치)
  • 탭 제스처 인식기 (3 개 탭, 1 터치)
  • 탭 제스처 인식기 (1 개 탭 2 개 접촉)

그 다음에 다음 코드를 배정 하였다.

- (IBAction)cancelTouch:(id)sender { 
    //do nothing 
} 

지금도 텍스트 뷰를 스크롤 할 수 있지만 긴 누르거나 두 번 탭하면 이제 아무 것도 할 수 없습니다.

관련 문제