【问题标题】:UITextView delegate never calledUITextView 委托从未被调用
【发布时间】:2012-01-18 20:48:45
【问题描述】:

我有一个 UITextview 委托 - (BOOL)textView:(UITextView *)textView 永远不会被调用,我已经为此苦苦挣扎了几天,但无济于事。这是我所拥有的

我已经在我的头文件和 ViewDidLoad 中声明了<UITextViewDelegate> 我正在设置委托,我已经尝试过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 中的章程数量。

【问题讨论】:

  • 第一个注释,你不会看到NSLog(@"something else changed");,因为ifelse 在他们到达那里之前都会执行return。 :-)
  • 是的,我知道这一点,我在退货之前进行了日志记录,但仍然没有运气。

标签: objective-c ios xcode cocoa-touch


【解决方案1】:

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

我很惊讶UITextViewtextViewDidChange: 发送给代理,因为the documentation 表示“不会调用此方法以响应以编程方式启动的更改。”

因此,您可以改为剪切 textViewDidChange: 中的文本(并依赖于其行为与文档不同),或修改 string1:string2: 以剪切文本。

【讨论】:

  • 你绝对帮我指出了正确的方向。我选择通过这样做if (myTextView.text.length &gt;= 10) { myTextView.text = [myTextView.text substringToIndex:10]; } NSLog(@"limit reached"); 来限制 textview 输入
猜你喜欢
  • 1970-01-01
  • 2021-09-27
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多