CRD*_*CRD 5

一个大纲算法:

  1. 得到选择 - selectedRange
  2. 创建一个长度为1的范围,覆盖选择的最后一个字符
  3. 用于lineRangeForRange获取构成该行的字符的范围,该选择的最后一个字符是.
  4. 现在向后工作并计数 - 你已经得到了包含选择的最后一个字符的行lineRangeForRange的范围,为前一行的最后一个字符设置了一个范围,并用于查找前一行的范围.重复此过程,直到到达文本的开头.您将拥有原始选择中最后一个字符的行号.
  5. 在上述每个行范围内,您可以检查选择的起始位置是否在该行中.请注意当前行数 - 从包含选择的最后一个字符的行开始为零,并且随着您前进到文本的开头而增加.当(4)的迭代结束时,简单的数学给出第一个字符的行号.

当然,您可以采用相反的方式 - 从文本中第一个字符的行范围开始,然后继续前进.对于每行检查选择的开始/结束是否在该行中,当您找到包含选择结束的行时停止.

对代码做相反的工作-给定的行范围内它会产生一个选择,以支付他们-看到苹果的文字编辑的代码示例,看看LinePanelController.m.虽然这与您想要阅读的内容相反,但它将显示上述方法的工作原理.

HTH.