When adding text to a text box programmatically, I found I also needed to add "[textView layoutIfNeeded]" to set things up before the new scroll position could be calculated correctly.
for example:
[newString appendFormat:@"%@\n",addText];
textView.text = newString;
[textView layoutIfNeeded];
NSRange range = NSMakeRange(textView.text.length - 2, 1); //I ignore the final carriage return, to avoid a blank line at the bottom
[textView scrollRangeToVisible:range]
Without this addition the textbox would sometimes not scroll, or would scroll several lines every time a single line of data was added.