2012-06-30 2 views
2

나는 UITextView이 있으며 두 개의 버튼이 필요합니다. 사용자가 뒤로 버튼을 누르면 커서가 1 문자 뒤로 이동합니다. 그들이 앞으로 버튼을 누르면 커서가 앞으로 1 문자 이동해야합니다. 내가 어떻게 할 수 있니?커서를 위치로 이동 목표 C

답변

5

아래에 링크 된 답변을 참조하여 작성했습니다. 내가 작성한 코드를 기본 프로젝트에 드롭하고 사용해 볼 수 있습니다.

솔루션 아이디어 :

프로그래밍 방식 (참고 참조) 선택 텍스트의 범위를 지정하여 텍스트 블록을 선택할 수 있습니다. 범위가 뭐니? 그것은 기본적으로 시작 위치와 길이입니다. 커서 위치 만 신경 써야하므로 길이를 무시 (즉, 0으로 유지)하고 "선택 항목"의 시작 위치를 +1 또는 -1로 조정할 수 있습니다.

참조 :

Can I select a specific block of text in a UITextField?

코드 설명 : 아래의 코드에서

, 그들 각각의 변경이 두 가지 버튼 (앞으로 및 뒤로)와 대상 방법이있다 UITextView의 커서 위치 tv은 UITextView의 클래스 변수/속성입니다 (따라서 선언해야 함).

강령 :

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIButton *forward = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    forward.frame = CGRectMake(20, 20, 100, 50); 
    [forward setTitle:@"Forward" forState:UIControlStateNormal]; 
    [forward addTarget:self action:@selector(moveForward:) forControlEvents:UIControlEventTouchUpInside]; 

    UIButton *back = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    back.frame = CGRectMake(130, 20, 100, 50); 
    [back setTitle:@"Back" forState:UIControlStateNormal];  
    [back addTarget:self action:@selector(moveBack:) forControlEvents:UIControlEventTouchUpInside]; 

    tv = [[UITextView alloc] initWithFrame:CGRectMake(20, 120, 280, 100)]; 
    [self.view addSubview:forward]; 
    [self.view addSubview:back]; 
    [self.view addSubview:tv];  
} 


-(void)moveForward:(id)sender { 
    UITextRange *selectedRange = [tv selectedTextRange]; 
    // Calculate the new position, - for left and + for right 

    if (tv.selectedRange.location < tv.text.length) { 
     UITextPosition *newPosition = [tv positionFromPosition:selectedRange.start offset:1]; 

     UITextRange *newRange = [tv textRangeFromPosition:newPosition toPosition:newPosition]; 

     // Set new range 
     [tv setSelectedTextRange:newRange]; 
    } 
} 

-(void)moveBack:(id)sender { 
    UITextRange *selectedRange = [tv selectedTextRange]; 
    // Calculate the new position, - for left and + for right 

    if (tv.selectedRange.location > 0) { 
     UITextPosition *newPosition = [tv positionFromPosition:selectedRange.start offset:-1]; 

     UITextRange *newRange = [tv textRangeFromPosition:newPosition toPosition:newPosition]; 

     // Set new range 
     [tv setSelectedTextRange:newRange]; 
    } 
} 
+1

에이 탄, 좋은 포괄적 인 해답을 제공 할 수 있습니다! (+1) – Anne

1

theSelectedRange 범위를 [theTextView selectedRange];으로 결정하십시오.
location 속성을 theSelectedRange으로 업데이트하거나 오프셋을 뺍니다.
선택하지 않은 경우 (삽입 점) length 속성은 0입니다.
theTextView.selectedRange = theSelectedRange;을 사용하여 커서를 놓습니다.
새 범위가 theTextView 콘텐츠의 범위를 벗어나지 않았는지 확인하십시오.

+0

당신은 몇 가지 코드 – Sirens

관련 문제