从未调用过UITextView委托

时间:2012-01-18 20:48:45

标签: objective-c ios xcode cocoa-touch

我有一个永远不会被调用的UITextview委托- (BOOL)textView:(UITextView *)textView,我一直在努力解决这个问题几天无济于事。这就是我所拥有的

我在头文件中声明了<UITextViewDelegate>,在ViewDidLoad中我设置了委托,我试过self.myTextView.delegate = self;myTextView.delegate = self;以及在NIB文件中连接委托,而不是以编程方式声明它。

我有一些自定义按钮可以通过2种不同的方法将文本插入到我的UITextView中,具体取决于按钮,这里的第一种方法是......

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

确实被调用但这个委托永远不会被调用

- (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中的章程数量。

1 个答案:

答案 0 :(得分:0)

UITextView仅向其委托发送textView:shouldChangeTextInRange:replacementText:以响应用户事件。当您的程序设置myTextView.text属性时,它不会发送该消息。

我很惊讶UITextView正在向代理发送textViewDidChange:,因为the documentation说&#34;此方法未响应以编程方式启动的更改而被调用。 &#34;

因此,您可以修改textViewDidChange:中的文字(并依赖其行为与文档不同),或修改string1:string2:来剪切文字。< / p>