Dailycode.info

Short solution for short problems

iOS: UITextView Maximum length in TableView or Collection View

I was using a UITextView with a custom layout that shows the borders like a textfield. I also needed a fixed length, to use in a collection view. Off course they didn't provide this simple feature. So I implemented it myself. For starters I added an extra property to my custom TextView: MaxLength. By default its 0 and when its 0, the text will be unlimited. If I set it to more then 0 the text will be limited to this number.

#import <UIKit/UIKit.h>

 

@interface MyTextView : UITextView

 

@property int MaxLength;

 

@end

In the initializer I set this property to 0, also I add the borders so it looks like a normal textfield:

- (id)initWithCoder:(NSCoder *)aDecoder

{

    self = [super initWithCoder:aDecoder];

    if (self) {

        // Initialization code

        [GeneralFunctionsMakeTextField:self];

        self.MaxLength=0;

    }

    returnself;

}

(Here's the MakeTextField function for those who are interested:)

+(void) MakeTextField:(UITextView *) vw

{

    vw.backgroundColor = [UIColorclearColor];

    UIImageView *borderView = [[UIImageViewalloc] initWithFrame: CGRectMake(0, 0, vw.frame.size.width, vw.frame.size.height)];

    borderView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

    UIImage *textFieldImage = [[UIImageimageNamed:@"TextField.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(15, 8, 15, 8)];

    borderView.image = textFieldImage;

    [vw addSubview: borderView];

    [vw sendSubviewToBack: borderView];

}

Now I implement the UITextViewDelegate on the control where it's used (I've set the MaxLength property using the runtime attributes in the attribute inspector of the story board):

-(BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

{

    if ([textView isKindOfClass:[MyTextView class]] && ((MyTextView *)textView).MaxLength>0 )

    {

        NSUInteger newLength = [textView.text length] + [text length] - range.length;

        return (newLength > ((MyTextView *)textView).MaxLength) ? NO : YES;

    }

    else

    {

        return YES;

    }

}