How do I limit characters in UITextView ? - iphone

I have been looking for solutions and found the following piece of code. But I do not know how to use it, unfortunately.
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)string {
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 25) ? NO : YES;
}
Just for testing purposes I set up an IBACTION
-(IBAction)checkIfCorrectLength:(id)sender{
[self textView:myTextView shouldChangeTextInRange: ?? replacementText: ?? ];
}
What do I pass for shouldChangeTextInRange and replacementText ?
Or am I getting it completely wrong ?

Calling textView:shouldChangeTextInRange:replacementText: from checkIfCorrectLength: doesn't make sense. If you want to test the length from multiple methods, factor the test out into its own method:
- (BOOL)isAcceptableTextLength:(NSUInteger)length {
return length <= 25;
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)string {
return [self isAcceptableTextLength:textField.text.length + string.length - range.length];
}
-(IBAction)checkIfCorrectLength:(id)sender{
if (![self isAcceptableTextLength:self.textField.text.length]) {
// do something to make text shorter
}
}

Hi I found and modified the code here. So for xamarin users. try the following:
textView.ShouldChangeText += delegate
{
if(textView.Text.Length > 159) // limit to one sms length
{
return false;
}
return true;
}

You don't call this method yourself, the text view calls it whenever it's about to change its text. Just set the text view's delegate property (e.g. to your view controller) and implement the method there.

If the current object is the delegate of the text view, then you can use the following snippet:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
return weightTextView.text.length + text.length - range.length < 7;
}
This worked for me.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if([text length] == 0)
{
if([textView.text length] != 0)
{
return YES;
}
else {
return NO;
}
}
else if([[textView text] length] > your limit value )
{
return NO;
}
return YES;
}

Related

Iphone should block 0 number in the keyboard

I've been writting iphone application in xcode, there is a form that contain phone number field. It must be contain 10 digits. If the user press 0 firstly in the keyboard, application must not write it.
For instance, phone number 05551234567, user can be only write 5551234567. If the user press 0, nothing happen.
First of all you should use
textView.keyboardType = UIKeyboardTypePhonePad
to choose the correct type of keyboard, so that you will be able to enter just numbers.
Secondly you must implement a UITextViewDelegate, set it as the text view delegate and implement a custom
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
that will check if you are trying to insert a 0 at the beginning of the content and return NO in that case.
If you are using a UITextField everything is the same, the only diffeference is that you will use UITextFieldDelegate and implement
- (BOOL)textField:(UITextField *)textField shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
Try following method.
by using below method user cannot enter 0 in textfield
- (BOOL)textField:(UITextField *)TextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:#"123456789"];
for (int i = 0; i < [string length]; i++)
{
unichar c = [string characterAtIndex:i];
if (![myCharSet characterIsMember:c])
{
return NO;
}
}
return YES;
}
And if you want that user cannot enter 0 only first place then use method like below
- (BOOL)textField:(UITextField *)TextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:#"123456789"];
if ([TextField.text length]<=0)
{
for (int i = 0; i < [string length]; i++)
{
unichar c = [string characterAtIndex:i];
if (![myCharSet characterIsMember:c])
{
return NO;
}
}
}
return YES;
}
I hope this will help you.

Disable return key in UITextView

I am trying to disable the return key found when typing in a UITextView. I want the text to have no page indents like found in a UITextField. This is the code I have so far:
- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString*)aText
{
if ([aTextView.text isEqualToString:#"\r\n"]) {
return NO;
}
Any ideas?
Try to use like this..
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if([text isEqualToString:#"\n"])
{
[textView resignFirstResponder];
return NO;
}
return YES;
}
Another solution without magic hardcoded strings will be:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText: (NSString *)text {
if( [text rangeOfCharacterFromSet:[NSCharacterSet newlineCharacterSet]].location == NSNotFound ) {
return YES;
}
return NO;
}
In Swift 3+ add:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
guard text.rangeOfCharacter(from: CharacterSet.newlines) == nil else {
// textView.resignFirstResponder() // uncomment this to close the keyboard when return key is pressed
return false
}
return true
}
Don't forget to add textView's delegate in order for this to be called
I know this is late reply but this code is perfect working for me.
This will disable return key initially until type any character.
textfield.enablesReturnKeyAutomatically = YES;
By Interface Builder set this property,
why dont you change UITextView return key type like this?

Keyboard is not responding after implementing UISearchBar delegate method

I have an UISearchBar which i implemented in my viewDidLoad: by code.
I have also set the UISearchBarDelegate.
Now i want to restrict the user from entering more than 5 chracter So i implement this delegate method
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
NSLog(#"shouldChangeTextInRange");
if (searchBar.text.length >= 5)
return NO;
return YES;
}
Its working fine.
The problem is when i typed upto 5 chracters & try to use the keyboard Backspace character, it is not working.
Also now if i pressed Search button in keyboard the searchBarSearchButtonClicked: is not getting called.
I am currently using
XCode version :3.2.5
iOS SDK :4.2
You should do your test on the new text length (then length of the text that you will have if the suggested text change is applied), not the actual text length.
For that, you first need to compute the new text :
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if ([text isEqualToString:#"\n"])
return YES; // accept validation button
NSString* newText = [searchBar.text stringByReplacingCharactersInRange:range withString:text];
if (newText.length >= 5)
return NO;
return YES;
}
You can't use backspace because of your code. after typing 5 characters, your searchBar is stuck. Use it instead :
if ([textField.text length] + [string length] - range.length > 5) {
return NO;
}

IPhone : How can I prevent inserting text if the text exceeds the size of a UITextview

I have a UITextView, the size of which is set through setFrame:CGRectMake(30, 100, 273, 140).
I would like to prevent inserting text that exceeds the size of the TextView.
So I've tried :
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
if ((textView.contentOffset.y + textView.frame.size.height) < textView.contentSize.height){
return NO;
}
else {
return YES;
}
return YES;
}
The pb is that when the condition is met, I can't use backspace to erase the extra text. The textview is no longer editable. What am I doing wrong here ?
Thanks for your help.
Have you tried something similar to this? I wrote it real quick and haven't tested it out. Let me know if it works. I don't know off the top of my head anything about the fonts, so you'll have to do some reading and adjust the code accordingly, where it says whateveryourfontis
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSSTring *newString = [NSString stringWithFormat:#"%#%#", textView.text, text];
CGSize *newSize = [newString sizeWithFont: [UIFont _whateveryourfontis_] constrainedToSize:textView.frame.size];
return (newSize.height > textView.frame.size.height) ? NO : YES;
}
Ok, I think I've found out by myself this time.
I don't know if it is the best solution but it works fine at least.
- (void)textViewDidChange:(UITextView *)uiViewContent{
if ((uiViewContent.contentOffset.y + uiViewContent.frame.size.height) < self.entryTextField2.contentSize.height){
self.entryTextField2.text=[self.entryTextField2.text substringToIndex:[self.entryTextField2.text length] - 1];
}
}
Hope it may help someone...
Mike

User input in UITextView call delegate method twice?

I want to compare a string with user input character by character. e.g. I want to let user input "I have an apple." and compare the input with this string to see if his input is correct. When he input a wrong character, iphone will vibrate to inform him immediately. The problem is that I find some characters like the space will call the delegate method twice- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
When I press the space key, the first time I compare the text with the ' ', the result will show me that they're the same character. But after that, I have to advance the index of string character to the next. And the second time the delegate method is called, iphone will vibrate. Any ideas about how to solve this problem?
Here is my code:
strText = #"I have an apple.";
index = 0;
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
NSRange rg = {index, 1};
NSString *correctChar = [strText substringWithRange:rg];
if([text isEqualToString:correctChar])
{
index++;
if(index == [strText length])
{
// inform the user that all of his input is correct
}
else
{
// tell the user that he has index(the number of correct characters) characters correct
}
}
else {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
return NO;
}
return YES;
}
try this
- (void)textViewDidChange:(UITextView *)textView{
if(![myStringToCompareWith hasPrefix:textView.text]){
//call vibrate here
}
}
Building on Morion's suggestion of using hasPrefix:, I think this is the solution that you are looking for:
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
// create final version of textView after the current text has been inserted
NSMutableString *updatedText = [NSMutableString stringWithString:textView.text];
[updatedText insertString:text atIndex:range.location];
if(![strTxt hasPrefix:updatedText]){
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
return NO;
}
return YES;
}