2011-10-03 96 views
0

有沒有人有關於如何將文件拖動到小目標的建議。我真正需要的是文件元數據。我不需要顯示文件本身,只是它的內容(這些是更像目錄的自定義文件)。我已經看到了拖到NSView的例子,但我想我需要的是拖到我的NSObject類中的一個簡單的小textView的例子。然後我需要獲取文件內容,以便我可以解析它。拖放到非視圖

可可要求所有的拖放操作都是通過視圖完成嗎? 任何幫助非常感謝

因此,以增加我之前發佈的內容; 我遵循http://juliuspaintings.co.uk/cgi-bin/paint_css/animatedPaint/072-NSView-drag-and-drop.pl的示例來拖放圖像。它適用於瀏覽器和Finder圖像,但不適用於其他文件類型。

追加2011年10月4日 如上所述,我遵循上面鏈接中的拖放示例來刪除基於TIFF的圖像。它可以像從網上或從Finder中將圖像拖放到自定義視圖中那樣工作。我不明白的是我需要做些什麼來使它適用於簡單的文本文件,甚至更重要的是定製文件。我已經閱讀了Mac Dev 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 

我希望有人能指出我需要學習如何得到這個想通了。也許是我對糊板的困惑,也許是我還沒有意識到的另一個組件。一如既往,我真的很感謝幫助。

由於

+2

如果在屏幕上顯示某些內容需要執行,那麼這肯定會是NSView? – iain

回答

3

首先,NSTextView是的NSView(較遠)的子類。其次,要收到下降事件,是的,你確實需要一個視圖。第三,你遇到的問題是拖動粘貼板上的信息類型。

設置視圖並註冊NSFilenamesPboardType,如Drag and Drop Programming Topics指南中所述。獲取文件名時,請使用NSFileManager或使用Spotlight元數據API獲取有關所需文件的任何信息。

+0

你能推薦一個鏈接來顯示爲各種文件創建拖放區的步驟嗎?我在網上看過一些關於拖放圖像的教程。我在 – Miek

+1

做過一個我給你解釋的。你有什麼嘗試,有什麼不工作呢? –

+0

當我嘗試拖放文本文件時,什麼都不會發生。如果if([zDesiredType isEqualToString:NSPasteboardTypeTIFF])那麼它工作,但如果Pasteboard不包含該字符串,則它爲空。據我所知,它應該有一個帶有txt文件名的字符串數組(NSFilenamesPboardType)。 – Miek