在nscollectionview中的nstableviews之间拖放将窗口控制器属性设置为nil?

时间:2011-05-26 14:47:40

标签: objective-c cocoa

在我的应用程序的主窗口中,我有一个集合视图,每个集合视图项都包含一个NSTableView。此窗口的窗口控制器具有NSString *属性projecttitle。此属性绑定到窗口中的NSTextField,我已覆盖默认的返回键行为,以便用户可以单击Return并将回车写入文本字段。 现在,在更改文本字段中的字符串并然后在两个不同的集合视图项的表视图之间拖动项目之后,projecttitle属性变为nil 。我有点觉得我在这里过得太多了,而且这个bug无法追查,但也许有人看到的东西甚至远远类似于其他地方的这种行为?

编辑:在projecttitle属性上设置断点似乎没有产生任何有用的东西。拖放时程序执行完全没有中断,但在此之后属性确实是零。

编辑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;
}

1 个答案:

答案 0 :(得分:0)

好的,解决了。原来这是-getObjectValue:forString:errorDescription:方法。我把它实现为

-(BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString **)error {
    *obj = string;
    return YES;
}

*obj = string更改为*obj = [NSString stringWithString:string]会修正所有内容。