问题描述
|
在应用程序的主窗口中,我有一个集合视图,这样每个集合视图项都包含一个NSTableView。该窗口的窗口控制器具有
NSString *
属性projecttitle
。此属性绑定到窗口中的NSTextField,我已经覆盖了该窗口的默认返回键行为,以便用户可以单击Return并将回车符写入文本字段。现在,更改文本字段中的字符串,然后在两个不同集合视图项目的表视图之间拖动一个项目后,projecttitle属性将变为nil
。我觉得也许我在这里做的事情太多了,并且这个错误将不可能被追查,但是也许有人在其他地方甚至看到了与这种行为非常相似的东西?
编辑:在projecttitle属性上放置一个断点似乎没有产生任何有用的信息。拖放时程序执行完全不会中断,但是此后该属性确实为nil。
编辑2:经过更多的挖掘后,似乎该行为与NSFormatter对象有关。它不仅在拖放时发生,而且很明显在nstextfield尝试辞职为响应者时发生。当我断开IB中的格式化程序对象时,此行为停止。这是格式化程序的字符串验证代码,该代码会强制字符串长度小于或等于4行,并且每行不超过32个字符。实际在文本字段中键入时,这似乎工作正常,但显然不是在此之后。
-(BOOL)isPartialStringValid:(NSString **)partialStringPtr
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
originalString:(NSString *)origString
originalSelectedRange:(NSRange)origSelRange
errorDescription:(NSString **)error {
NSArray * lines = [*partialStringPtr componentsSeparatedByString:@\"\\n\"];
if ( [lines count] > 4 ) {
return NO;
}
for (NSString * line in lines) {
if ( [line length] > self.maxlength ) {
return NO;
}
}
return YES;
}
解决方法
好,解决了原来是
-getObjectValue:forString:errorDescription:
方法。我把它实现为
-(BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error {
*obj = string;
return YES;
}
将*obj = string
更改为*obj = [NSString stringWithString:string]
可以固定所有内容。