2012-01-18 3 views
1

У меня есть делегат UITextview - (BOOL)textView:(UITextView *)textView, который никогда не звонит, и я боролся с этим в течение нескольких дней безрезультатно. Вот что у меня естьUITextView делегат никогда не назывался

Я объявил <UITextViewDelegate> в моем файле заголовка и в ViewDidLoad я устанавливаю делегат, я попытался self.myTextView.delegate = self; и myTextView.delegate = self; вместе с проводкой до делегата в файле NIB вместо того, чтобы объявить его программно.

У меня есть несколько пользовательских кнопок, которые вставляют текст в моем UITextView 2 различными способами, в зависимости от кнопки, первый способ здесь ...

-(IBAction)string1:(id)sender { 

NSRange range = myTextView.selectedRange; 
NSString * firstHalfString = [myTextView.text substringToIndex:range.location]; 
NSString * secondHalfString = [myTextView.text substringFromIndex: range.location]; 
myTextView.scrollEnabled = NO; 

NSString * insertingString = [NSString stringWithFormat:@"insert my text string"]; 

myTextView.text = [NSString stringWithFormat: @"%@%@%@", 
       firstHalfString, 
       insertingString, 
       secondHalfString]; 
range.location += [insertingString length]; 
myTextView.selectedRange = range; 
myTextView.scrollEnabled = YES;} 

и второй метод ...

-(IBAction)string2:(id)sender { 

myTextView.text = [myTextView.text stringByAppendingString:@"my other string value"];} 

С NSLog включен, я могу видеть, что

- (void)textViewDidChange:(UITextView *)textView{ 
NSLog(@"something changed");} 

действительно дозвонились, но это д elegate никогда не вызывается

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { 
NSUInteger newLength = (textView.text.length - range.length) + text.length; 
if(newLength <= MAX_LENGTH) 
{ 
    return YES; 
} else { 
    NSUInteger emptySpace = MAX_LENGTH - (textView.text.length - range.length); 
    textView.text = [[[textView.text substringToIndex:range.location] 
         stringByAppendingString:[text substringToIndex:emptySpace]] 
        stringByAppendingString:[textView.text substringFromIndex:(range.location + range.length)]]; 
    return NO; 
} 
NSLog(@"something else changed");} 

В верхней части моего файла .M я определил #define MAX_LENGTH 100

Любая помощь будет очень ценится, моя общая цель состоит в том, чтобы ограничить количество чартеров в UITextView.

+0

Прежде всего вы не увидите 'NSLog (@« что-то еще изменилось »);' потому что '' '' '' '' '' '' '' '' '' '' 'прежде чем они туда попадут. :-) –

+0

Да, я знаю, что у меня была регистрация до возвращения, но все равно не повезло. – Dan

ответ

0

UITextView отправляет textView:shouldChangeTextInRange:replacementText: своему делегату в ответ на пользовательские события. Он не отправляет это сообщение, когда ваша программа устанавливает свойство myTextView.text.

Я удивлен, что UITextView отправляет делегату textViewDidChange:, так как the documentation говорит: «Этот метод не вызывается в ответ на программно инициированные изменения».

Таким образом, вы можете скопировать текст в textViewDidChange: вместо этого (и полагаться на его поведение, отличное от документации) или изменить и string1: и string2:, чтобы скопировать текст.

+0

Вы определенно помогли мне, указав на меня в правильном направлении. Я решил ограничить ввод текстового поля, сделав это 'if (myTextView.text.length> = 10) { \t myTextView.text = [myTextView.text substringToIndex: 10]; } NSLog (ограничение «достигнуто»); – Dan

Смежные вопросы