I am using the below written method for getting the current selected line number of textView having attributed text. It works fine if last line is not blank. If last line goes blank this method is not giving a proper line number.

Method :

    - (NSInteger)getCurrentLineIndex{
        /*
         Get Current Line Inside UITextView
         */
        CGPoint cursorPosition = [self caretRectForPosition:self.selectedTextRange.start].origin;
        return (NSInteger)(cursorPosition.y / self.font.lineHeight);
    }

Is there any other way to get the current line index?


Fixed :  I already had mRangesArray in which each object gave a range of each line. Using those range objects and comparing with the selected range, I was able to fix the problem.

1)获取范围数组
-(无效)分析
{
如果(self.mRangesArray!= nil){
[self.mRangesArray removeAllObjects];
}
NSString * string = self.text;
NSUInteger numberOfLines,索引,stringLength = [字符串长度];
    NSMutableArray *ranges = [NSMutableArray new];
    for (index = 0, numberOfLines = 0; index < stringLength; numberOfLines++)
    {
        NSRange range = [string lineRangeForRange:NSMakeRange(index, 0)];
        [ranges addObject:[NSValue valueWithRange:range]];
    }
    if (self.mRangesArray == nil) {
        self.mRangesArray = [[NSMutableArray alloc]init];
    }
    self.mRangesArray = ranges;
}

2)比较RangesArray中的Range对象与当前选定的Range
-(NSInteger)getCurrentLineIndex {
/ *
此方法将用于获取mRangesArray
* /
[自我分析];
    /*
     Get Current Line Inside UITextView
     */

    NSRange selectedRange = self.selectedRange;

   __block NSInteger index = [self.mRangesArray count]-1;
    [self.mRangesArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSRange objectRange = [obj rangeValue];
        if (*stop == NO) {
            if (NSLocationInRange(selectedRange.location, objectRange)) {
                index = idx;
                *stop =YES;
                return;
              }
        }
    }];

}

谢谢大家帮助。干杯:)

最佳答案

编辑:我显然已经忽略了您问题中当前选中的部分的
如果有人需要,我仍将代码保留在这里。

您是否尝试过计算换行符?

let str = "First\nSecond\nThird"
let tok = str.componentsSeparatedByString("\n")
print(tok.count) // Hopefully prints "3"

关于ios - 如何在UITextView中获取当前选择的行号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37391593/

10-13 05:02