2

我有一个UITextView,我想要两个按钮。当用户点击后退按钮时,我希望光标向后移动 1 个字符。当他们点击向前按钮时,光标应向前移动 1 个字符。我怎么能这样做?

4

2 回答 2

5

我为你写了它,参考下面链接的答案。你可以把我写的代码放到一个基础项目中试试看。

解决思路:

您可以通过指定要选择的文本范围以编程方式选择文本块(请参阅参考资料)。你问什么是范围?它基本上是一个起始位置和一个长度。由于您只关心光标位置,您可以忽略长度(即保持为零)并将“选择”的起始位置调整 +1 或 -1。

参考:

我可以在 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];
    }
}
于 2012-06-30T18:37:41.553 回答
1

通过确定theSelectedRange范围[theTextView selectedRange];。通过减去或添加偏移量来
更新 的location属性。 如果未进行任何选择(插入点),则该属性为零。 使用 定位光标。 确保新范围没有超出内容的范围。theSelectedRange
length
theTextView.selectedRange = theSelectedRange;
theTextView

于 2012-06-30T18:01:32.377 回答