Swift 中的拖放 - 注册拖动类型时出现问题?

2024-04-24

背景

我正在尝试在 Swift 中进行一些简单的拖放操作,类似于 Apple 的示例代码可可拖放 https://developer.apple.com/library/mac/samplecode/CocoaDragAndDrop/Introduction/Intro.html。在出现错误之前我还没有走多远。

我创建了一个 swift 类 dropView,代码位于底部。 self.registered 类型似乎有效,因为我得到了一长串图像类型或更短的列表。

当我将用于注册拖动类型的数组设置为 TIF 和 jpeg 类型时,我没有得到 DraggingEntered 或 DraggingUpdated 的响应。看来我错过了一些简单的事情?我将自定义视图设置为 dropView 类。

另外,当数组设置为 NSImage.imagePasteBoardTypes() 时,当我拖动文件(至少对于 TIF 和 jpeg)时,会出现许多错误,请参阅帖子底部的 **。

问题

为什么draggingEntered 或draggingUpdated 没有被调用?

其他问题:

我是否正确注册了拖动类型? 数组的格式是否正确? 文件顶部的 NSDraggingDestination 属性位是否位于正确的位置?

Code

import Cocoa

class dropView: NSView, NSDraggingDestination {

init(frame: NSRect) {
    super.init(frame: frame)
    //let theArray = [NSImage.imagePasteboardTypes()]
    let theArray = ["NSTypedFilenamesPboardType:jpg",
        "NSTypedFilenamesPboardType:JPG",
        "NSTypedFilenamesPboardType:jpeg",
        "NSTypedFilenamesPboardType:JPEG",
        "NSTypedFilenamesPboardType:jpe",
        "NSTypedFilenamesPboardType:TIF"]

    registerForDraggedTypes(theArray)
    println("INIT and REGISTER")
    println(self.registeredDraggedTypes)
}

override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)

    // Drawing code here.
}


override func draggingEntered(sender: NSDraggingInfo!) -> NSDragOperation {
    println("Dragging Entered")
    return NSDragOperation.Copy
}

override func draggingUpdated(sender: NSDraggingInfo!) -> NSDragOperation  {
    println("UPDATED")
    return NSDragOperation.Copy
}

}

** NSImage.imagePasteBoardTypes() 时出错

2014-06-21 11:34:38.728 DragAndDrop[96606:303] -[__NSArrayM length]: unrecognized selector sent to instance 0x610000049d80  
2014-06-21 11:34:38.729 DragAndDrop[96606:303] -[__NSArrayM length]: unrecognized selector sent to instance 0x610000049d80  
2014-06-21 11:34:38.730 DragAndDrop[96606:303] (
    0   CoreFoundation                      0x00007fff8ddaf25c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff83a5de75 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8ddb212d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00007fff8dd0d322 ___forwarding___ + 1010
    4   CoreFoundation                      0x00007fff8dd0cea8 _CF_forwarding_prep_0 + 120
    5   LaunchServices                      0x00007fff8aee1b0a XCFStringHashCaseInsensitive + 111
    6   CoreFoundation                      0x00007fff8dc6afd8 CFBasicHashFindBucket + 1032
    7   CoreFoundation                      0x00007fff8dc989c9 CFSetGetValueIfPresent + 121
    8   CoreFoundation                      0x00007fff8dc9892c -[__NSCFSet member:] + 28
    9   CoreFoundation                      0x00007fff8dccb008 -[NSSet containsObject:] + 24
    10  CoreFoundation                      0x00007fff8dd18fcf -[NSSet intersectsSet:] + 735
    11  AppKit                              0x00007fff86c645ff -[NSView(NSDrag) _hitTest:dragTypes:] + 221
    12  AppKit                              0x00007fff86c645d2 -[NSView(NSDrag) _hitTest:dragTypes:] + 176
    13  AppKit                              0x00007fff86c645d2 -[NSView(NSDrag) _hitTest:dragTypes:] + 176
    14  AppKit                              0x00007fff86c6438c -[NSWindow(NSDrag) _findDragTargetFrom:] + 111
    15  AppKit                              0x00007fff86c63280 NSCoreDragTrackingProc + 476
    16  HIServices                          0x00007fff8b8a05a3 DoEnterLeaveHandler + 389
    17  HIServices                          0x00007fff8b8a2fdd CoreDragMessageHandler + 1741
    18  CoreFoundation                      0x00007fff8dd5ace8 __CFMessagePortPerform + 760
    19  CoreFoundation                      0x00007fff8dce08d9 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
    20  CoreFoundation                      0x00007fff8dce084e __CFRunLoopDoSource1 + 478
    21  CoreFoundation                      0x00007fff8dcd1886 __CFRunLoopRun + 1830
    22  CoreFoundation                      0x00007fff8dcd0f25 CFRunLoopRunSpecific + 309
    23  HIToolbox                           0x00007fff8b908a0d RunCurrentEventLoopInMode + 226
    24  HIToolbox                           0x00007fff8b9087b7 ReceiveNextEventCommon + 479
    25  HIToolbox                           0x00007fff8b9085bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
    26  AppKit                              0x00007fff8695726e _DPSNextEvent + 1434
    27  AppKit                              0x00007fff869568bb -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
    28  AppKit                              0x00007fff8694a9bc -[NSApplication run] + 553
    29  AppKit                              0x00007fff869357a3 NSApplicationMain + 940
    30  DragAndDrop                         0x00000001000033fd top_level_code + 109
    31  DragAndDrop                         0x000000010000343a main + 42
    32  libdyld.dylib                       0x00007fff8e1925fd start + 1
    33  ???                                 0x0000000000000003 0x0 + 3
)
2014-06-21 11:34:40.729 DragAndDrop[96606:303] -[__NSArrayM length]: unrecognized selector sent to instance 0x610000049d80
2014-06-21 11:34:40.730 DragAndDrop[96606:303] -[__NSArrayM length]: unrecognized selector sent to instance 0x610000049d80
2014-06-21 11:34:40.731 DragAndDrop[96606:303] (
    0   CoreFoundation                      0x00007fff8ddaf25c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff83a5de75 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff8ddb212d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x00007fff8dd0d322 ___forwarding___ + 1010
    4   CoreFoundation                      0x00007fff8dd0cea8 _CF_forwarding_prep_0 + 120
    5   LaunchServices                      0x00007fff8aee1b0a XCFStringHashCaseInsensitive + 111
    6   CoreFoundation                      0x00007fff8dc6afd8 CFBasicHashFindBucket + 1032
    7   CoreFoundation                      0x00007fff8dc989c9 CFSetGetValueIfPresent + 121
    8   CoreFoundation                      0x00007fff8dc9892c -[__NSCFSet member:] + 28
    9   CoreFoundation                      0x00007fff8dccb008 -[NSSet containsObject:] + 24
    10  CoreFoundation                      0x00007fff8dd18fcf -[NSSet intersectsSet:] + 735
    11  AppKit                              0x00007fff86c645ff -[NSView(NSDrag) _hitTest:dragTypes:] + 221
    12  AppKit                              0x00007fff86c645d2 -[NSView(NSDrag) _hitTest:dragTypes:] + 176
    13  AppKit                              0x00007fff86c645d2 -[NSView(NSDrag) _hitTest:dragTypes:] + 176
    14  AppKit                              0x00007fff86c6438c -[NSWindow(NSDrag) _findDragTargetFrom:] + 111
    15  AppKit                              0x00007fff86c63280 NSCoreDragTrackingProc + 476
    16  HIServices                          0x00007fff8b89fca4 DoTrackingMessage + 370
    17  HIServices                          0x00007fff8b8a2b36 CoreDragMessageHandler + 550
    18  CoreFoundation                      0x00007fff8dd5ace8 __CFMessagePortPerform + 760
    19  CoreFoundation                      0x00007fff8dce08d9 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 41
    20  CoreFoundation                      0x00007fff8dce084e __CFRunLoopDoSource1 + 478
    21  CoreFoundation                      0x00007fff8dcd1886 __CFRunLoopRun + 1830
    22  CoreFoundation                      0x00007fff8dcd0f25 CFRunLoopRunSpecific + 309
    23  HIToolbox                           0x00007fff8b908a0d RunCurrentEventLoopInMode + 226
    24  HIToolbox                           0x00007fff8b9087b7 ReceiveNextEventCommon + 479
    25  HIToolbox                           0x00007fff8b9085bc _BlockUntilNextEventMatchingListInModeWithFilter + 65
    26  AppKit                              0x00007fff8695726e _DPSNextEvent + 1434
    27  AppKit                              0x00007fff869568bb -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122
    28  AppKit                              0x00007fff8694a9bc -[NSApplication run] + 553
    29  AppKit                              0x00007fff869357a3 NSApplicationMain + 940
    30  DragAndDrop                         0x00000001000033fd top_level_code + 109
    31  DragAndDrop                         0x000000010000343a main + 42
    32  libdyld.dylib                       0x00007fff8e1925fd start + 1
    33  ???                                 0x0000000000000003 0x0 + 3
)

(Swift 3、Xcode 8b6、OSX 10.11)

苹果推荐 https://developer.apple.com/reference/appkit/nspasteboard/1654154-types_for_standard_data_os_x_v10不应再使用旧式的粘贴板类型并使用UTIs https://developer.apple.com/library/mac/documentation/MobileCoreServices/Reference/UTTypeRef/index.html#//apple_ref/doc/constant_group/Type_Tag_Classes在可能的情况下 - 更好的版本是

self.register(forDraggedTypes: [kUTTypeURL as String])

这意味着您可以从 Finder 接收所有文件类型的拖动。

Since NSImage.imagePasteboardTypes已被弃用且无需替换,您应该在 DraggingEntered 中处理过滤:

override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        let pasteboard = sender.draggingPasteboard()
        let filteringOptions = [NSPasteboardURLReadingContentsConformToTypesKey:NSImage.imageTypes()]
                if pasteboard.canReadObject(forClasses: [NSURL.self], options: filteringOptions) {
                        return NSDragOperation.copy
        }      
        return NSDragOperation() //alternatively: []
}

(使用 NSPasteboardURLReadingContentsConformToTypesKey 的功劳归于@TroutDev教程在这里 https://www.raywenderlich.com/136272/drag-and-drop-tutorial-for-macos)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中的拖放 - 注册拖动类型时出现问题? 的相关文章

  • SwiftUI TabbedView 仅显示第一个选项卡的内容

    我正在尝试建立一个TabbedView使用以下简单代码 TabbedView Text Hello world tabItemLabel Text Hello Text Foo bar tabItemLabel Text Foo 运行时 两
  • NSAttributedString 和表情符号:位置和长度问题

    我正在使用 NSAttributedString 对来自 API 的文本的某些部分 如 Twitter 上的 mention 进行着色 API 为我提供了文本和代表文本中应着色的部分 或链接 标签等 的实体数组 但有时 颜色会因为表情符号而
  • 将深层链接传递到 iOS 模拟器?

    我想找到一种更简单的方法来在 iOS 模拟器中调用深层链接 在 Android 上 您可以使用 ADB 通过控制台将链接传输到模拟器中 是否有类似的方法或解决方法来打开最新 iOS 模拟器的深层链接 您可以在终端中输入以下内容 xcrun
  • 平滑地将渐变应用于 UIImage

    我正在尝试使用 CoreGraphic 将渐变应用于 UIImage 然而 我得到的结果不是很好 我想在图像底部创建一个黑色到透明的渐变 以便为我放置一些文本创建对比度 然而 我能够实现的渐变与图像不能很好地融合 你可以清楚地看到中心的分离
  • 当前位置在 Google 地图中不起作用

    我在 swift 3 中集成了谷歌地图 当地图屏幕出现而不显示当前位置时 我在 plist 文件中添加了两个键 并设置了 CLLocationManager delegate 和 requestAlwaysAuthorization cla
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE
  • Swift iOS 9.2 中的每日本地通知

    尝试快速发送每日本地通知 然而 由于某种原因 它只是每分钟发送一次 我希望第一个通知在应用程序打开后 30 分钟发送 然后每天重复此通知 在 swift fie 中我有以下代码 每日通知代码 同时在应用程序委托中添加部分 让 Date NS
  • Swift 每 5 天重复一次 LocalNotification

    如何每 5 天上午 10 00 重复一次 LocalNotification 我尝试这个 但它不起作用 let content UNMutableNotificationContent content title Hello content
  • iOS-Swift UIApplication.shared.isIdleTimerDisabled = true 在 AppStore 审核后不起作用

    努力实现停止屏幕在某些情况下进入睡眠状态View Controller 我做了什么我已在运行 iOS 12 1 12 的物理 iPhone 6 上使用以下代码测试了我的应用程序 我设置了手机Dislpay Brigthness gt Aut
  • 在 try 中使用零合并运算符? for 抛出并返回可选值的函数

    我想在以下两种情况下使用 nil coalescing 运算符设置默认值 函数抛出错误 函数返回 nil 请看一下下面的代码片段 我有以下问题 为什么 item1 为零 item1和item2的初始化有什么区别 enum VendingMa
  • 如何在 Objective-C 标头中引用 Swift 枚举

    有没有办法从 Objective C 标头引用 Swift 枚举 如果你想在 Objective C 头中查看 Swift 类 你可以使用 objc class Foo 我没有看到枚举有任何类似的东西 你想做的事情叫做forward dec
  • Swift 如何格式化带有千位分隔符的大数字?

    有没有一个简单的命令可以将 1 60543e 06 格式化为 1 605 436 resultFV text String localizedStringWithFormat f fv 不明白 在斯威夫特 3 中 NumberFormatt
  • swift 中带有字符的单引号

    我已经完成了 C C Java 这些语言告诉我字符用单引号括起来 主要是在遵守正确的语法时 但字符串是双引号的 Swift 的语法是否只允许字符位于单引号内 或者提供这种语法背后有一些有效的原因 逻辑 let char1 Character
  • 防止拖动不可拖动元素时出现重影?

    我正在创建一个利用 HTML5 拖放 API 的网站 但是 为了增加用户体验 我想在用户拖动不可拖动元素时防止出现重影 这可能吗 此外 几乎每个元素似乎 可拖动的 默认情况下 人们可以单击然后快速拖动浏览器中的几乎任何元素 这会创建一个重影
  • 如何在 tvOS 中添加检测按钮按下情况?

    我已经遵循这个tutorial http jamesonquave com blog developing tvos apps for apple tv with swift 一切正常 我遇到的唯一问题是我不知道如何检测何时按下按钮 提前致
  • Swift:如何审查/过滤输入的脏话等文本?

    我只是想看看是否有一种既定的方法可以做到这一点 或者如何去做 我有一个文本字段 它本质上充当我的 iOs 应用程序中的表单 用户可以在其中发布内容 我不能让用户发布脏话 不恰当的废话 所以我想过滤掉他们输入的字符串包含这些单词之一的内容并显
  • SwiftUI ScrollView 只向一个方向滚动

    尝试使用视图作为列表行样式来创建自定义列表 以摆脱默认情况下列表中难看的分隔线 但是 一旦我将 ZStack 行放入滚动视图中 滚动视图就会在两个方向上滚动 而不仅仅是垂直滚动 这是内容视图 NavigationView ScrollVie
  • 如何在 Swift 编程中获得基于导航的模板功能

    我的项目需要一个导航控制器 并且我的应用程序最初有一个社交登录 一旦验证通过 用户将被推送到另一个视图 我在其中显示一个具有 2 个选项卡的选项卡控制器 我不知道如何在 Swift 编程中做到这一点 我已将视图控制器嵌入到导航控制器中 一旦
  • 如何获取 ios 日期数组中的所有星期日

    我只想要一个数组 它以 NSDate 的形式包含一年中的所有星期一 但速度很快 我在 Objective c 中使用以下代码 但不知道如何在 swift 中使用它 NSDate pickerDate NSDate date NSLog pi
  • iOS Swift 中断键盘事件

    我在拦截键盘事件时遇到问题 我已将我的 iOS 与 SteelSeries Free 游戏手柄控制器 连接 当连接到 iOS 时 它将被检测为蓝牙键盘 这是在我打开Notes时测试的 按下游戏手柄上的任何按钮都会写一个字母 我需要拦截此按钮

随机推荐

  • 如何惯用地复制切片?

    在 Go 中 复制切片是标准操作 如下所示 It will figure out the details to match slice sizes dst copy dst n src m 在 Rust 中 我找不到类似的替换方法 我想出的
  • 如何将 ActiveRecord 模型属性从 json 迁移到 jsonb?

    迁移应该是什么样子 我想利用 jsonb 数组查询技术 我会这样写迁移 def change reversible do dir dir up change column models attribute jsonb USING CAST
  • 持久订阅 ActiveMQ

    我正在尝试为我的消息设置持久订阅者 以便即使在服务器重新启动后它们也能保留在主题中 但在配置过程中我收到与 xml 相关的错误 这是我的配置 xml
  • sin 和 cos 很慢,有其他选择吗?

    我的游戏需要移动一定的角度 为此 我通过 sin 和 cos 获得角度向量 不幸的是 正弦和余弦是我的瓶颈 我确信我不需要这么精确 是否有替代 C sin cos 和查找表的方法 既相当精确 又非常快 我发现了这个 float Skelet
  • TypeScript getter setter 约定

    TypeScript 中类属性的约定 标准 是什么 在 Angular 2 演示 来自 Angular io 的英雄之旅 中 所有属性都设置为 public export class Hero id number name string 所
  • 允许按位运算的通用约束?

    我有一个enum public enum Flags COMMAND MSG 1 COMMAND FILE 2 COMMAND ACTION 4 现在 假设我设置了多个值 例如 Flags g Flags COMMAND ACTION Fl
  • 激活conda环境在vscode中停止工作

    我注意到conda激活环境没有明显原因就停止在 vscode 集成终端中工作 我当然没有安装任何新的扩展 也没有在过去几天更新 conda 或 vscode 预期行为 运行 conda activate 环境后 我希望激活环境并能够使用环境
  • Mercurial 子存​​储库 - 管理更复杂的依赖关系层次结构

    我有一个主项目 它使用相当标准的源代码树方法 Mercurial 子存 储库 Master lib compiled binaries things like log4net AutoFac etc source VS solution o
  • 自动将不同的 Excel 文件导入 MS Access 2010 表

    我想将所有 Excel 文件 具有不同的数据和列 从某个目录导入到 MS Access 2010 数据库中 为每个文件创建新表 我找到了将文件导入到一张表中的代码 Option Compare Database Option Explici
  • geany 自定义文件类型 .svrf 用于语法突出显示

    我有一个类似的问题 我复制并编辑了filetype extensions conf in my config geany adding CALIBRE rul svrf SVRF cal 然后下 config geany filedefs我
  • 如何调试意外静默终止的 win32 进程?

    我有一个用 C 编写的 Windows 应用程序 有时会消失 我使用 蒸发 这个词是因为没有留下任何东西 没有来自 Windows 的 我们很抱歉 消息 没有来自 Dr Watson 设施的故障转储 有一次崩溃发生在调试器下 调试器没有中断
  • React Native STUCK 启动打包器

    由于某种原因 当我想启动我的 React Native 项目时 它卡在 正在启动 Packager 部分 我尝试删除节点包 然后重新安装它们 通过yarn npm安装它们 但没有成功 我不知道该如何解决这个问题 太尴尬了 我遇到过同样的问题
  • 正确结束 Java 命令行应用程序

    我只是想知道 我需要打电话吗System exit 0 就在之前mainJava 命令行应用程序的方法结束了吗 如果是这样 为什么 如果我总是放在那里 与让它自行退出有什么区别0 什么没清理干净 提前致谢 不 您并不总是需要打电话Syste
  • 如何在张量流中将TextVectorization保存到磁盘?

    我已经训练了一个 TextVectorization 层 见下文 我想将其保存到磁盘 以便下次可以重新加载它 我努力了pickle and joblib dump 这是行不通的 from tensorflow keras layers ex
  • 如何在文本文件中逐行读取和替换字符串?

    我有一个文本文件 内容如下 INSERT INTO shops VALUES 3 1000000 0 INSERT INTO shops VALUES 3 1000010 0 INSERT INTO shops VALUES 3 10000
  • 对内核模块代码进行单元测试是否可行?

    如果是这样我应该使用什么技术 我正在考虑使用 hippomock 因为它们可以用来模拟 C 方法 还有更好的方法吗 如果是这样 任何人都可以提供建议 或者您认为内核的单元测试是否太过分了 从 Linux 内核版本 5 5 开始KUnit可用
  • 如何绕过mysql中无效的utf8字符串

    我有一个包含阿拉伯文本数据的大文本文件 当我尝试将其加载到 MySQL 表中时 出现错误消息Error code 1300 invalid utf8 character string 这是我到目前为止所尝试过的 LOAD DATA INFI
  • 无法通过 Socket.IO 从 cookie 获取 Express 会话 ID

    我在 Node 中有一个典型的 Web 应用程序 它利用 Express 框架和会话中间件 我还将 Socket io 用于应用程序的某些动态部分 目前 这是一种聊天机制 但这是无关的 我已经能够成功地自行设置会话和socket io 但希
  • 将 Flex ByteArray 转换为 Java byte[]

    我正在尝试将使用 rtmp 协议从 Flex GUI 发送的文件上传到服务器上 我昨天问如何在服务器上发送文件数据 通过rtmps java上传文件到服务器 https stackoverflow com questions 2310855
  • Swift 中的拖放 - 注册拖动类型时出现问题?

    背景 我正在尝试在 Swift 中进行一些简单的拖放操作 类似于 Apple 的示例代码可可拖放 https developer apple com library mac samplecode CocoaDragAndDrop Intro