illyabusigin / CYRTextView

CYRTextView is a UITextView subclass that implements a variety of features that are relevant to a syntax or code text view.
MIT License
535 stars 71 forks source link

Making some lines of text un-editable #27

Open mbcoder17 opened 9 years ago

mbcoder17 commented 9 years ago

When the user selects a line, or tries to edit/delete text, I check the current line against a rule of mine, and use the textView delegate method shouldChangeTextInRange (returning false) to ensure that specific lines of text cannot be changed by he user. However, I have run into some issues with line numbers becoming negative and/or incorrect in the process. For example, let's say I want the last 2 lines of my textview to be un-editable, I save the total number of lines, and I fetch the current line in the shouldChangeTextInRange method. If the current line is greater-than or equal to the total number of lines-1, return false. Now, this works if I select the last two lines and try to edit, it will stop me. But if I select the line above (which happens to take up 2 lines on the device) and start deleting, the line numbers become all messed up when I start to add new lines. Here is my code:

    public func textView(textView: UITextView, shouldChangeTextInRange range: NSRange,    replacementText text: String) -> Bool {

    let myCharRange = self.textView.myLayoutManager.characterRangeForGlyphRange(range, actualGlyphRange: nil)
    let myParaNumber = self.textView.myLayoutManager._paraNumberForRange(myCharRange)
    let myInt = self.textView.myLastLine.integerValue

    if myParaNumber+1 <= 12 || Int(myParaNumber+1) >= myInt-1 {

        return false
    } else {

        return true
    }
}
mbcoder17 commented 9 years ago

Here is a sample project I made that shows the issue: https://www.dropbox.com/s/crpbw49rvv5s4q0/CYRTextView-master-2.zip?dl=0

mbcoder17 commented 9 years ago

Here are steps to reproduce on a simulator and device:

Simulator:

  1. Run the example (iPhone 5s) and select the line that contains the text “on one chart"
  2. Press enter and then use the up arrow to move the cursor up one line, you should see that the first line number is now “0”
  3. Now select the line that contains the text “on one chart” again, and press enter and press the up arrow key, and the line numbers will now start with -1.

Device:

  1. Run the example and select the line that contains the text “on one chart"
  2. Press enter try to enter text
  3. Now, tap once on the line and press “Select” from the menu that pops up, and the line numbers should now start at 0 instead of 1.
  4. Repeat to move into the negatives.
mbcoder17 commented 9 years ago

@illyabusigin were you able to figure this out?