【问题标题】:Reading Multiple Dragged-n-Dropped Files读取多个拖放文件
【发布时间】:2013-05-08 20:51:08
【问题描述】:

我在主 xib (MainMenu.xib) 中有一个小窗口,其中有一个用于 OS X 应用程序的 NSImageView 控件。这个视图控件有一个 NSImageView 子类,它应该接受用户带来的文件(拖放)。由于我没有使用 Objective-C 开发 Mac 应用程序的经验,因此我四处搜索,查看了一些来自 Apple 的示例项目,并得到了一些想法。好吧,为了简单起见,我刚刚复制了here 发布的代码。有用。太好了……以下是简明版本。

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{
    return NSDragOperationCopy;
}

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{
}

- (void)draggingExited:(id <NSDraggingInfo>)sender{
}

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

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
    NSPasteboard *pboard = [sender draggingPasteboard];
    if ([[pboard types] containsObject:NSURLPboardType]) {
        NSURL *fileURL = [NSURL URLFromPasteboard:pboard];
        NSLog(@"Path: %@", [self convertPath:fileURL]); // <== That's just what I need
    }
    return YES;
}

- (NSString *)convertPath:(NSURL *)url {
    return url.path;
}

目前,无论用户拖放到下拉框中的文件数量如何,下拉框一次只能获取一个文件路径。所以我想知道的是如何让应用程序读取用户带来的所有多个文件。

谢谢,

【问题讨论】:

    标签: objective-c macos osx-mountain-lion nspasteboard nsdragginginfo


    【解决方案1】:

    将您的 performDragOperation: 方法更改为:

    - (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
        NSPasteboard *pboard = [sender draggingPasteboard];
        if ([[pboard types] containsObject:NSURLPboardType]) {
            NSArray *urls = [pboard readObjectsForClasses:@[[NSURL class]] options:nil];
            NSLog(@"URLs are: %@", urls); 
        }
        return YES;
    }
    

    【讨论】:

    • 非常感谢。有用。似乎以下主题也可以帮助我。 stackoverflow.com/questions/1998158/…
    • 这个答案是金。我在从我的粘贴板上接收多个 NSURL 时遇到了巨大的麻烦。我总是被限制在一个。这解决了它。
    【解决方案2】:

    Swift 风格:

    override func performDragOperation(sender: NSDraggingInfo) -> Bool 
    {
        if let board = sender.draggingPasteboard().propertyListForType(NSFilenamesPboardType) as? NSArray 
        {              
            for imagePath in board
            {
                if let path = imagePath as? String
                {
                     println("path: \(path)")
                }
            }                
            return true               
        }
        return false
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2013-10-28
      相关资源
      最近更新 更多