Перетаскивание в без просмотра - PullRequest
0 голосов
/ 03 октября 2011

Есть ли у кого-нибудь предложения о том, как перетаскивать файл на маленькую цель? Что мне действительно нужно, так это метаданные файлов. Мне не нужно отображать сам файл, только его содержимое (это пользовательские файлы, которые больше похожи на каталоги). Я видел примеры перетаскивания в NSView, но мне кажется, что мне нужен пример перетаскивания в простой маленький textView в моем классе NSObject. Затем мне нужно получить содержимое файлов, чтобы я мог разобрать его.

Требует ли Какао, чтобы все перетаскивания производились через Представления? Любая помощь очень ценится

Итак, чтобы добавить к тому, что я опубликовал ранее; Я последовал примеру на http://juliuspaintings.co.uk/cgi-bin/paint_css/animatedPaint/072-NSView-drag-and-drop.pl для перетаскивания изображений. Он отлично работает как для браузеров, так и для Finder для изображений, но не будет работать для файлов других типов.

добавлено 04.10.2011 Как указано выше, я следовал примеру перетаскивания по ссылке выше для удаления изображений на основе TIFF. Он работает как и для перетаскивания изображений в пользовательский вид из Интернета или из Finder. Что я не понимаю, так это то, что мне нужно, чтобы заставить его работать для простых текстовых файлов и, что еще важнее, для пользовательских файлов. Я прочитал информацию о перетаскивании на сайте Mac Dev, но до сих пор не понимаю ее достаточно, чтобы внести необходимые изменения.

Вот мой код:

//myNSView.h
#import <Cocoa/Cocoa.h>

@interface MyNSView : NSView
{
    NSImage *nsImageObj;

}
@property(assign) NSImage *nsImageObj;

-(IBAction)reset:(id)sender;

@end



//myNSV.m


#import "MyNSView.h"

@implementation MyNSView
@synthesize nsImageObj;

- (id)initWithFrame:(NSRect)frame
{
    if(!(self = [super initWithFrame:frame]))
    {
        NSLog(@"Error: MyNSView initWithFrame");
        return self;
    }//end if
    self.nsImageObj = nil;

    [self registerForDraggedTypes:[NSArray arrayWithObjects: NSTIFFPboardType, NSFilenamesPboardType, nil]];
    return self;
}//end initWithFrame

- (void)drawRect:(NSRect)dirtyRect
{
    if(self.nsImageObj == nil){
        [[NSColor blackColor]set];
        NSRectFill(dirtyRect);
    }//end if

    NSRect zOurBounds = [self bounds];
    [super drawRect:dirtyRect];
    [self.nsImageObj compositeToPoint:(zOurBounds.origin) operation:NSCompositeSourceOver];
}
-(IBAction)reset:(id)sender{
    NSLog(@"reset Button Pressed");
    nsImageObj = nil;
   NSLog(@"check Image %@", self.nsImageObj);
    [[NSColor blackColor]set];
    [self setNeedsDisplay:YES];
}

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

    //is the sender looking for NSDragOperationGeneric
    if((NSDragOperationGeneric & [sender draggingSourceOperationMask]) == NSDragOperationGeneric)
        return NSDragOperationGeneric;
    else
        return NSDragOperationNone;

}//end draggingEntered


-(BOOL) prepareForDragOperation:(id<NSDraggingInfo>)sender{
    return YES;
}// end prepareForDragOperation

-(BOOL)performDragOperation:(id<NSDraggingInfo>)sender{
   //initialize pasteboard
    NSPasteboard *zPasteboard = [sender draggingPasteboard];
    //initialize image file types, addedd some extra
    NSArray *zImageTypesArray =[NSArray arrayWithObjects:NSPasteboardTypeTIFF,NSFilenamesPboardType, nil];

    NSString *zDesiredType = [zPasteboard availableTypeFromArray: zImageTypesArray];

            if([zDesiredType isEqualToString:NSPasteboardTypeTIFF]){

                NSData *zPasteboardData = [zPasteboard dataForType:zDesiredType];

                //make sure we have data
                if(zPasteboardData == nil){
                    NSLog(@"Error: MyNsView zPasteBoardData == nil");
                    return NO;
                }//end if nil

                self.nsImageObj = [[NSImage alloc] initWithData: zPasteboardData];
                [self setNeedsDisplay:YES];

                return YES;

            }//end outer if
            //if desired types is a string of filenames
    if([zDesiredType isEqualToString:NSFilenamesPboardType]){
        NSArray *zFileNamesAry = [zPasteboard propertyListForType:@"NSFilenamesPboardType"];
        NSString *zPath = [zFileNamesAry objectAtIndex:0];

        NSImage *zNewImage = [[NSImage alloc] initWithContentsOfFile:zPath];

                if(zNewImage == nil){

                    NSLog(@"Error: MyNSView performDragOperation zNewImage = nil");
                    return NO;
                }

                //else everything is good in here

        self.nsImageObj = zNewImage;
        [self setNeedsDisplay:YES];
        return YES;

    }//end outer if

    //if we get here than there was an unknown error return no
    NSLog(@"Error Unknown in MYNSView performDragOperation");
    return NO;
}

-(void)concludeDragOperation:(id<NSDraggingInfo>)sender{

    [self setNeedsDisplay:YES];

}

@end

Я надеюсь, что кто-то сможет указать, что мне нужно выучить, чтобы понять это. Может быть, это моя путаница с Pasteboards, может быть, это еще один компонент, о котором я даже не подозреваю. Как всегда, я очень ценю помощь.

Спасибо

1 Ответ

3 голосов
/ 04 октября 2011

Во-первых, NSTextView является подклассом NSView (удаленно).Во-вторых, чтобы получать события отбрасывания, да, вам действительно нужен просмотр.В-третьих, у вас возникают проблемы с типом информации на перетаскиваемой монтажной панели.

Настройте представление и зарегистрируйте NSFilenamesPboardType, как описано в руководстве Перетаскивание и программирование .Получив имена файлов, используйте NSFileManager или используйте API метаданных Spotlight, чтобы получить любую информацию о файле, который вам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...