NSOutlineView拖线卡住+蓝色边框

2024-03-01

我想要正确的行为蓝色拖动条, and 没有蓝色矩形拖动时。

你知道我的错误在哪里吗?

(如您所见,蓝色条卡在顶部,就像本主题中一样:使用拖放重新排列时,小圆线条卡在 NSOutlineView 顶部 https://stackoverflow.com/questions/15593387/little-circle-line-bar-stuck-at-top-of-nsoutlineview-when-rearranging-using-drag)

import Cocoa

class ViewController: NSViewController, NSOutlineViewDataSource, NSOutlineViewDelegate, NSPasteboardItemDataProvider {

    @IBOutlet weak var outlineView: NSOutlineView!

    let REORDER_PASTEBOARD_TYPE = "com.test.calques.item"

    override func viewDidLoad() {
        super.viewDidLoad()

        //Register for the dropped object types we can accept.
        outlineView.register(forDraggedTypes: [REORDER_PASTEBOARD_TYPE])

        //Disable dragging items from our view to other applications.
        outlineView.setDraggingSourceOperationMask(NSDragOperation(), forLocal: false)

        //Enable dragging items within and into our view.
        outlineView.setDraggingSourceOperationMask(NSDragOperation.every, forLocal: true)

        outlineView.delegate = self;
        outlineView.dataSource = self;
    }

    override var representedObject: Any? {
        didSet {
            // Update the view, if already loaded.
        }
    }

    var items: [(String, NSColor)] = [
        ("Item 1",  NSColor.black),
        ("Item 2",  NSColor.red),
        ("Item 3",  NSColor.red),
        ("Item 4",  NSColor.red),
        ("Item 5",  NSColor.red),
        ("Item 6",  NSColor.red)];

    //NSOutlineViewDataSource
    func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
        return items.count;
    }

    func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
        return false
    }

    func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
        return items[index];
    }

    func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
        let image: NSImage = NSImage(size: NSSize(width: 17, height: 17));
        let calquesItem: (String, NSColor) = item as! (String, NSColor);
        let path = NSBezierPath(ovalIn: CGRect(x: 2, y: 2, width: 17 - 4, height: 17 - 4));

        image.lockFocus();
        calquesItem.1.setFill();
        path.fill();
        image.unlockFocus();

        let cell = outlineView.make(withIdentifier: "DataCell", owner: nil) as! NSTableCellView;
        cell.textField!.stringValue = calquesItem.0;
        cell.imageView!.image = image;

        return cell;
    }

    //Drag - NSOutlineViewDataSource
    var fromIndex: Int? = nil;

    func outlineView(_ outlineView: NSOutlineView, pasteboardWriterForItem item: Any) -> NSPasteboardWriting? {
        let pastBoardItem: NSPasteboardItem = NSPasteboardItem();

        pastBoardItem.setDataProvider(self, forTypes: [REORDER_PASTEBOARD_TYPE]);

        return pastBoardItem;
    }

    func outlineView(_ outlineView: NSOutlineView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItems draggedItems: [Any]) {

        Swift.print("willBeginAt")

        let item = draggedItems[0] as! (String, NSColor);

        fromIndex = items.index(where: { (_item: (String, NSColor)) -> Bool in
            return _item.0 == item.0
        });

        session.draggingPasteboard.setData(Data(), forType: REORDER_PASTEBOARD_TYPE)
    }

    func outlineView(_ outlineView: NSOutlineView, acceptDrop info: NSDraggingInfo, item: Any?, childIndex index: Int) -> Bool {
        Swift.print("acceptDrop")

        if(fromIndex! != index && index != -1) {
            let toIndex: Int = fromIndex! < index ? index - 1 : index;

            outlineView.moveItem(at: fromIndex!, inParent: nil, to: toIndex, inParent: nil);

            items.insert(items.remove(at: fromIndex!), at: toIndex);

            return true;
        }

        return false;
    }

    func outlineView(_ outlineView: NSOutlineView, validateDrop info: NSDraggingInfo, proposedItem item: Any?, proposedChildIndex index: Int) -> NSDragOperation {
        if(item == nil) {
            return NSDragOperation.generic;
        }

        return [];
    }

    func outlineView(_ outlineView: NSOutlineView, draggingSession session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
        Swift.print("Drag session ended")
        fromIndex = nil;
    }

    //NSPasteboardItemDataProvider
    func pasteboard(_ pasteboard: NSPasteboard?, item: NSPasteboardItem, provideDataForType type: String)
    {
        item.setString("Outline Pasteboard Item", forType: type)
    }

}

From https://developer.apple.com/reference/appkit/nsoutlineview https://developer.apple.com/reference/appkit/nsoutlineview :

大纲视图中的每个项目都必须是唯一的。为了 折叠状态在重新加载项目之间保持一致 指针必须保持相同,并且项必须保持 isEqual(_:) 相同性。

我正在使用元组(字符串,NSColor)。并且元组不符合可哈希协议!

从 Tuples 项目切换到 MyClass 项目后,一切正常! (蓝色拖动条的正确行为,拖动时没有蓝色矩形)

class MyClass {
    var name: String!
    var color: NSColor!

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

NSOutlineView拖线卡住+蓝色边框 的相关文章

随机推荐

  • iOS 音频单元会切断高于某个频率的声音

    我在接收声音 UDP WiFi 时遇到一些问题 我想尽可能清除它 所以一开始我想切断高于某个频率的声音 显然 我从套接字获取了原始数据 然后将其复制到输出缓冲区 我确信应该在那里进行精确的切断 你能建议我吗 我当前的回调代码 static
  • java中的kadane算法

    我在 java 中有以下 Kadane 算法的实现 基本上是找到连续子数组的最大和 String numbers string split int max so far 0 int max ending here 0 for int i 0
  • selenium 是否可以使用 xpath 通过“for”属性找到标签元素?

    selenium 是否可以使用 xpath 通过 for 属性找到标签元素 我正在测试一个连续有 7 个是或否问题的网站 CSS 的完成方式是单击标签而不是输入单选按钮 通常我只是通过文本内容查找元素 但每个问题都有一个 是 和 否 我认为
  • Cassandra - 从集群中删除节点

    我有一个包含三个节点的集群 我需要删除一个节点 在实际删除之前 如何确保要删除的节点中的数据将复制到其他两个节点 这是使用快照完成的吗 我应该如何进行 来自doc http cassandra apache org doc latest o
  • 带有刷新令牌的 JSON Web 令牌身份验证逻辑

    Angular 4 应用程序在浏览器 网站后端 中运行 显示特定用户拥有的服务器数据 服务器 PHP MySQL Zend Framework 3 Doctrine ORM Naming access token 生命周期短 1 分钟 允许
  • 如何在Excel中设置默认的特殊粘贴以仅粘贴值[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的 Excel 中的一个单元格用作用户输入框 如果用户在此单元格中粘贴某些内容 我只想粘贴值而不是格式 有没有办法将粘贴选项的默认值设置
  • Laravel 5.2 模型 $fillable 被忽略?

    我有一个简单的模型IsolatedQuery其中包括一个name and query场地 我已经在中定义了这两个字段 fillable模型的属性 isolatedQueryController store 看起来像这样 public fun
  • 如何在自定义 python-sphinx 指令/扩展中使用现有指令?

    我想创建一个自定义的Directive使用现有指令 code block在这个例子中 在它的实现中 reStructuredText 中的手动等效项是 mydirective py code block py print Hello wor
  • Powershell 中非常大的 XML 文件

    对于非常大的文本文件 我们可以选择使用 StreamReader 和 StreamWriter 然后允许逐行查找 替换 但是 我有一个 XML 文件 需要在其中进行查找 替换并进行更多控制 例如查找 替换特定节点中的值 该节点是具有特定属性
  • Git - 如何自动将目录中的更改推送到另一个分支

    完成问题重写 所以我以为我正在非常简单和直接地解释这个问题 但似乎我过于简单化了 所以这里是所有额外的细节 希望这可以帮助每个人看到这也不是重复的 我有一个存储库 项目 我想在其中自动化将提交从一个分支中的一个目录推送到另一个分支的过程 我
  • 使用“:”(冒号)按属性选择元素

    在我的项目中 有一个库生成元素的情况 我需要从那里选择特定的元素 它恰好包含带有 的属性 换句话说 我最终尝试选择使用 document querySelectorAll xml space 但是 在 Chrome 中测试时 它不起作用 也
  • 无法在 Xcode 10 中查找屏幕比例和意外的物理屏幕方向

    我最近将 Xcode 更新到版本 10 现在我的控制台显示 MyApp 1618 133310 AXMediaCommon Unable to look up screen scale MyApp 1618 133310 AXMediaCo
  • 点击 pageControl 滚动到另一个视图(点击点)

    我已经设置了具有 2 个视图的 PageViewControll 我可以在视图之间移动 并且 pageControl 点 对应于正确的页面 但是点击点还不能滚动到正确的视图 我在这里找到了一些关于如何创建该函数的答案 但无法成功实现以使其工
  • 带有自定义操作的 installshield

    我正在使用 installshield 2012 prime 创建一个基本的 msi 项目 我有两个问题 1 MSI 在创建要安装的应用程序的文件夹和文件后需要运行自定义 exe 只需在安装应用程序时执行一次此操作 2 MSI 还需要告诉正
  • iOS MobileVLCKit 存档问题

    在尝试归档我的项目时 我得到了这个error ld bitcode bundle could not be generated because Users MobileVLCKit MobileVLCKit framework Mobile
  • 如何将 Apigility 与现有 ZF2 应用程序结合使用?

    我有一个带有一些模块的 ZF2 应用程序 我希望允许在我的应用程序中使用具有 Apigility 的现有模块 我尝试使用 Composer 安装这些模块 require php gt 5 3 3 phpoffice phpexcel mon
  • 为映射和/或嵌套对象自定义 Spring @RequestParam 反序列化

    RestController class MyController RequestMapping public void test Container container Spring 默认使用 Dot Notation 来反序列化嵌套的
  • 为什么 Google+ 登录完成登录时出错?

    我最近一直在处理 Android 上的 Google 登录问题 有一件事一直困扰着我 在他们所有官方认可的示例中 没有一个方法专门显示登录过程 每次尝试让某人登录时调用的方法称为resolveSignInError 如下所示 private
  • 溢出与 Inf

    当我输入一个大于 max 的数字时double https en wikipedia org wiki Double precision floating point format在 Matlab 中大约是1 79769e 308 例如10
  • NSOutlineView拖线卡住+蓝色边框

    我想要正确的行为蓝色拖动条 and 没有蓝色矩形拖动时 你知道我的错误在哪里吗 如您所见 蓝色条卡在顶部 就像本主题中一样 使用拖放重新排列时 小圆线条卡在 NSOutlineView 顶部 https stackoverflow com