NSTextView Drag & Drop Символы не видны после перетаскивания

У меня есть подклассы NSTextView, чтобы я мог удалить файл и скопировать содержимое строки файла в представление (в отличие от стандартной реализации, которая отбрасывает путь к файлу в представление). Текст вроде сбрасывается правильно, но потом не виден после сбрасывания. Я вижу, что курсор переместился, и даже могу скопировать выпавший текст из представления и вставить, например, в TextEdit. Я попытался добавить [self setNeedsDisplay:YES] в конце моего метода -performDragOperation:, но поведение не изменилось.

Вот код, который я написал до сих пор. Я думаю, что это не лучший способ реализовать это. Я новичок в реализации перетаскивания в какао.

-(NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {

    NSPasteboard *pb = [sender draggingPasteboard];
    NSDragOperation dragOperation = [sender draggingSourceOperationMask];

    if ([[pb types] containsObject:NSFilenamesPboardType]) {
        if (dragOperation & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }
    if ([[pb types] containsObject:NSPasteboardTypeString]) {
        if (dragOperation & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }

    return NSDragOperationNone;

}


-(BOOL)performDragOperation:(id<NSDraggingInfo>)sender {

    NSPasteboard *pb = [sender draggingPasteboard];

    if ( [[pb types] containsObject:NSFilenamesPboardType] ) {
        NSArray *filenames = [pb propertyListForType:NSFilenamesPboardType];

        for (NSString *filename in filenames) {
            NSStringEncoding encoding;
            NSError * error;
            NSString * fileContents = [NSString stringWithContentsOfFile:filename usedEncoding:&encoding error:&error];
            if (error) {
                // handle error
            }
            else {
                [self setString:fileContents];
            }
        }

    }

    else if ( [[pb types] containsObject:NSPasteboardTypeString] ) {
        NSString *draggedString = [pb stringForType:NSPasteboardTypeString];
        [self setString:draggedString];
    }

    return YES;

}

person Sean    schedule 20.12.2011    source источник
comment
Полезный указатель, но он полагается на суперкласс, выполняющий большую часть тяжелой работы, так как он уже принимает эти два типа картона. Если вы используете свой собственный тип монтажного стола, вам также придется вызвать registerForDraggedTypes, а также реализовать acceptableDragTypes и prepareForDragOperation.   -  person Grimxn    schedule 20.11.2018


Ответы (1)


У меня была заглушка для -drawRect:, у которой не было реализации.

После удаления заглушки все работает именно так, как задумано.

person Sean    schedule 20.12.2011