2012-01-18 22 views
1

UITextviewデリゲート- (BOOL)textView:(UITextView *)textViewが呼び出されることは決してありません。私は数日間無駄にこれを苦労しています。ここで私は、私は、デリゲートを設定しています私のヘッダファイルとのviewDidLoadで<UITextViewDelegate>UITextViewデリゲートは一度も呼び出されていません

を宣言していたものですが、私はNIBファイルにデリゲートをアップ配線の代わりに、プログラム的にそれを宣言するとともに、self.myTextView.delegate = self;myTextView.delegate = self;を試してみました。

私はボタンに応じて、2種類の方法で私UITextViewにテキストを挿入し、いくつかのカスタムボタンを持って、ここでは第1の方法は...

-(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;} 

で、第2の方法はある...

NSLogで
-(IBAction)string2:(id)sender { 

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

は私が

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

が呼び出さないことを確認することができ、オンが、このD elegateは、私はすべてのヘルプは非常に高く評価されるだろう#define MAX_LENGTH 100

を定義している私の.mファイルの先頭で

- (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");} 

と呼ばれることは決してありません、私の全体的な目標は、UITextViewでのチャーターの数を制限することです。

+0

最初の注記では、 'if'と' else'の両方がそこに着く前に 'return'を実行するので、' NSLog(@ "something else changed"); 'は表示されません。 :-) –

+0

はい、私はそれを知っています、私は返品前にロギングを持っていましたが、まだ運がありません。 – Dan

答えて

0

UITextViewは、ユーザーイベントに応答してtextView:shouldChangeTextInRange:replacementText:のみをその代理人に送信します。プログラムがmyTextView.textプロパティを設定しても、そのメッセージは送信されません。

the documentationは「このメソッドはプログラムによって開始された変更に応じて呼び出されません」というので、UITextViewが代理人にtextViewDidChange:を送信していることに驚いています。

代わりにtextViewDidChange:にテキストをクリップすることができます(また、その動作はドキュメントとは異なります)。またはstring1:string2:を変更してテキストをクリップすることができます。

+0

あなたは間違いなく私を正しい方向に向けてくれました。テキストビュー入力を制限することを選択しました。 'if(myTextView.text.length> = 10) { \t myTextView.text = [myTextView.text substringToIndex:10]; } NSLog(@ "限界に達しました"); – Dan

関連する問題