Sean
Sean

Reputation: 5820

Drag and drop between nstableviews in nscollectionview sets window controller property to nil?

In the main window of my application, I have a collection view such that each collection view item contains an NSTableView. The window controller for this window has an NSString * property projecttitle. This property is bound to an NSTextField in the window for which I have overridden the default return key behavior so that the user can hit Return and write a carriage return into the text field. Now, after changing the string in the text field and THEN dragging an item between the table views for two different collection view items, the projecttitle property becomes nil. I sort of feel like maybe I just have way too much going on here and that this bug will be impossible to track down, but maybe someone has seen something even remotely similar to this behavior elsewhere?

EDIT: Putting a breakpoint on the projecttitle property doesn't seem to yield anything useful. The program execution does not break at all upon dragging and dropping, but the property will indeed be nil after this.

EDIT 2: After more digging around, it appears the behavior is related to the NSFormatter object. It happens not only when dragging and dropping, but apparently any time the nstextfield attempts to resign as responder. This behavior stops when I disconnect the formatter object in IB. Here's the string validation code for the formatter which forces the string to be less than or equal to 4 lines long and with each line being no longer than 32 characters. This seems to work fine when actually typing the in the text field, but apparently, not after.

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

Upvotes: 0

Views: 415

Answers (1)

Sean
Sean

Reputation: 5820

Okay, solved. Turned out it was the -getObjectValue:forString:errorDescription: method. I had it implemented as

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

Changing *obj = string to *obj = [NSString stringWithString:string] fixed everything right up.

Upvotes: 0

Related Questions