重新加载不同的表视图单元格后,NSOutlineView 行不再可以通过“Return”键编辑

2023-12-11

我遇到了最奇怪的问题NSOutlineView:

  • 一切都在故事板中设置,即大纲视图和两个NSTableCellViews
  • 两个单元格视图基本相同,只有一个显示图标,另一个不显示
  • 我可以通过按开始编辑项目(行)Return键,即NSTextField这是我的一部分NSTableCellView进入编辑模式。这是默认行为,到目前为止工作正常。

However:

  • 编辑结束并且项目发生更改后,我使用故事板中的第二个表视图单元格(没有图标的单元格)。
  • 现在按进入“编辑”模式Return钥匙不再起作用了!应用程序发出蜂鸣声,就这样。

最初加载时,两个单元格视图本身都是可编辑的。我证实了这一点。当某个项目首先显示在一个表格单元格视图中,然后显示在另一个表格单元格视图中(反之亦然)时,就会出现问题。

多次编辑一个项目效果很好,然后底层的NSTableCellView不会改变。有人能解释一下这里发生的事情吗?

重现:

  1. 新的 Xcode 项目,Mac 应用程序
  2. Add an NSOutlineView用一列连接到您的视图控制器
  3. 添加两个表格视图单元格,“一”,“二”(标识符)
  4. 使用下面的代码

Steps:

  1. 运行应用程序,选择第二项
  2. 按“返回”,输入“绿色”,“返回”
  3. 再次按“Return”再次进入编辑模式

预期的:

  • 单元格应该再次变得可编辑

Actual:

  • 应用程序发出蜂鸣声

NSOutlineView

Code:

import Cocoa

class ViewController: NSViewController, NSOutlineViewDataSource, NSOutlineViewDelegate, NSTextFieldDelegate {

    @IBOutlet var outlineView: NSOutlineView!

    private var items = ["One", "Two"]

    func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
        return item == nil ? items.count : 0
    }

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

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

    func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
        guard let item = item as? String else { return nil }

        NSLog("Vending cell view for: \(item)")

        let identifier = item.contains("green") ? "Two" : "One"

        if let view = outlineView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: identifier), owner: nil) as? NSTableCellView
        {
            view.textField?.stringValue = item

            view.textField?.delegate = self

            return view
        }
        return nil
    }

    func controlTextDidEndEditing(_ obj: Notification) {
        NSLog("Did end editing")

        guard
            let textField = obj.object as? NSTextField,
            let item      = outlineView.item(atRow: outlineView.row(for: textField)) as? String else {
            return
        }

        NSLog("Reloading item: \(item)")

        let row = outlineView.row(for: textField)

        items[row] = textField.stringValue

        outlineView.reloadItem(item)
    }
}

UPDATE:

我找到了解决方法,但这对我来说看起来像是一个错误。如果我打电话outlineView.reloadData(forRowIndexes:columnIndexes:)就在之后reloadItem(),问题不会发生。

不起作用(出现问题):

outlineView.reloadItem(item)

不起作用(outlineView的数据模型未更新,显示旧值):

outlineView.reloadData(forRowIndexes: IndexSet([row]), columnIndexes: IndexSet([0]))

这最终有效:

outlineView.reloadItem(item)
outlineView.reloadData(forRowIndexes: IndexSet([row]), columnIndexes: IndexSet([0]))

上述导致单元格视图被第二次请求。


None

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

重新加载不同的表视图单元格后,NSOutlineView 行不再可以通过“Return”键编辑 的相关文章

  • 从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext 上

    我有一个主NSManagedObjectContext是在appDelegate 现在 我正在使用另一个NSManagedObjectContext用于编辑 添加新对象而不影响主对象NSManagedObjectContext 直到我拯救它
  • 如何将本机 C 类型与 PerformSelectorOnMainThread: 一起使用?

    我想打电话 void setDoubleValue double value using performSelectorOnMainThread 我认为可行的是 NSNumber progress NSNumber numberWithDo
  • 为 Linux 编译 Objective-C 应用程序(API 覆盖范围)

    我可能在这里问一些奇怪的问题 但我不确定从哪里开始 问题是我正在考虑使用 Obj C 和 Foundation 类在 Mac 上编写一个命令行工具 但存在一个非常大的风险 那就是我希望能够为不同的 Linux 发行版编译它 以便将来作为服务
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • 在 OS X 上创建和使用静态库

    好的 我正在尝试创建一个 Cocoa 库 静态 并使用 但我不断收到错误 我创建了一个超基本的静态库 TSXLib 其中仅包含一个额外的类 import
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void
  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • Cocoa 应用程序菜单栏不可点击

    我正在我的可可应用程序中构建一个菜单栏 其中包含以下代码 implementation我的自定义应用程序CustomApplication void setUpMenuBar CustomApplication sharedApplicat
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • 如何调用ical同步服务?

    我有一个通过日历存储框架与 iCal 同步的应用程序 我注意到我需要打开 iCal 同步服务才能启动并将应用程序添加的事件和任务传输到我的 ipad 和 iphone 所以 我的问题是 有没有办法在不打开ical的情况下启动ical同步服务
  • 从 NSMutableArray 中获取最后五个值

    我有一个NSMutableArray其计数为 10 我想提取最后 5 个值并将它们存储在另一个数组中 我怎样才能做到这一点 我觉得 NSArray subarrayWithRange NSRange range doc https deve
  • 为 NSToolbar 制作 NSToolbar 图标

    我想为我的 NSToolbar 制作一个图标 其应用的系统样式与 IB 中的模板图标相同 你怎么做到这一点 我无法让工具栏像 HIG 中所说的那样应用系统样式 Thanks 在 Mac OS X v10 5 或更高版本中 名称以 Templ
  • 将 NSAlert 设为最顶层窗口?

    我在应用程序中创建了主窗口以进行以下设置 self setLevel kCGDesktopWindowLevel 1 self setCollectionBehavior NSWindowCollectionBehaviorCanJoinA
  • NSCollectionView 拖放:大多数委托事件未被调用

    我有一个 NSCollectionView 绑定到一个 NSArrayController 我想让拖放工作 所以我创建一个委托并实现方法 BOOL collectionView NSCollectionView collectionView
  • 如何确定卷是否支持垃圾箱?

    我正在编写一个将删除文件的应用程序 如果该卷支持 垃圾箱 文件夹 我想将文件移动到那里 否则只需删除它们 这可能只是我的搜索魔力让我失败 但我找不到如何做到这一点 这里的目的是做类似的事情 伪代码 if itemURL on volume
  • 相当于 AppKit 的 NSObliquenessAttributeName 的 CoreText 是什么?

    我正在使用 CoreText 在 Mac iOS 跨平台代码中绘制一些文本 我可能使用的字体没有在操作系统中为所有用户安装真正的 斜体 版本 但他们需要知道即使这样文本也是斜体的 通过 AppKit 的 NSAttributedString
  • Cocoa 常量名称中的“k”代表什么[重复]

    这个问题在这里已经有答案了 可能的重复 Apple 的 API 中的 k 前缀表示什么 https stackoverflow com questions 675816 what does the k prefix indicate in
  • 子类化 NSSlider:需要解决丢失鼠标向上事件的问题(Cocoa OSX)

    我正在尝试对 NSSlider 进行子类化以创建一个称为滚轮的控件 基本上我需要的是一个滑块 它总是从中间开始 当它移动到左侧或右侧时 它会经常发送通知 由可以设置的属性确定 通知其容器其当前值 然后当您放开旋钮 它会回到中间 我希望实现将
  • 使 Swift 类符合需要 init 的协议

    我有以下内容protocol in Swift protocol FooConvertible typealias FooType init foo FooType 我会做Swift类在类定义中符合它 class Bar FooConver
  • 从 NSString 的第一行删除换行符

    我怎样才能删除第一个 nNSString 中的字符 编辑 只是为了澄清一下 我想做的是 如果字符串的第一行包含 n 字符 请将其删除 否则不执行任何操作 即 如果字符串是这样的 nhello this is the first line n

随机推荐

  • 如何将字符串放入矩形内?

    我正在尝试将一些字符串 图像和表格添加到我的 pdf 文件中 必须有几页 但是当我尝试使用ColumnText 我使用这个是因为我想将字符串放置在绝对位置 我遇到了一个问题 当列高不足以添加字符串内容时 内容不完整 如何避免内容丢失 这是相
  • 比较一个字符串与几个不同的字符串

    我想将一个字符串与多个字符串进行比较 在 C 中这是如何完成的 如果你想检查一个字符串是否包含在字符串列表中 你可以使用Contains扩展方法 bool isStringContainedInList new string1 string
  • HttpServletRequest getLocale 返回操作系统区域设置而不是浏览器区域设置

    我正在使用 vaadin 框架 在我的应用程序中我有 Override public void onRequestStart HttpServletRequest request HttpServletResponse response c
  • 如何使用 shell 脚本将 HiveQL 查询的结果输出到 CSV?

    我想运行多个 Hive 查询 最好是并行而不是顺序运行 并将每个查询的输出存储到 csv 文件中 例如 query1输出在csv1 query2输出在csv2等等 我会在下班后运行这些查询 目标是在下一个工作日分析输出 我对使用 bash
  • 如何解决 Pandas 中的错误“远程过程调用协议流中传入的表格数据流不正确”

    我有一个 pandas 数据框 正在将其写入 SQL Server 中的表中 数据框包含以下数据类型 Contact ID object Skill No float64 Skill Name object Campaign No floa
  • 什么是“不完全构造的对象”?

    Goetz s Java 并发实践 第 41 页 提到如何this引用可以在构造过程中逃逸 一个 不要这样做 的例子 public class ThisEscape public ThisEscape EventSource source
  • 正则表达式仅匹配整数

    正如标题所述 我正在尝试构建一个正则表达式来从字符串中提取整数 实际情况是 我有一个非常大的代码文件 整数 和一些值 小数 我可以成功提取小数 d d 这可能看起来很奇怪 但我也捕获了 1 或 1 但是我无法提取整数 直到现在我有类似的东西
  • 为什么在 Java 中循环内声明似乎比循环外声明更快?

    当我检查这个时Question不敢相信 所以我测试了一下 似乎是真的 循环内声明似乎比循环外声明更快 有人可以解释这是为什么吗 这是我的测试代码 public class CycleTest param args the command l
  • 如何将 sys.stdout 复制到日志文件?

    编辑 因为看起来要么没有解决方案 要么我正在做一些非常不标准的事情以至于没有人知道 我将修改我的问题以询问 当 python 应用程序正在制作时完成日志记录的最佳方法是什么很多系统调用 我的应用程序有两种模式 在交互模式下 我希望所有输出都
  • JavaScript - 获取浏览器高度

    我正在寻找一个代码片段来获取浏览器窗口中可视区域的高度 我有这段代码 但是它有些问题 好像主体没有超过窗口的高度 然后它会变短 document body clientHeight 我尝试了其他一些方法 但它们要么返回 NaN 要么返回与上
  • 如何解绑和重新绑定

    archive click function event do something archive2 unbind click event 我有这个点击功能 我取消了绑定 但是 当我单击某个按钮时 我想再次绑定它 archive bind
  • 如何设置 SQL Server 2005 作业 CmdExec 超时

    我在 SQL Server 2005 中有一个作业设置 其中有一个操作系统 CmdExec 步骤 该步骤调用一个可能需要很长时间才能运行的程序 我发现 如果程序响应时间超过 1 分 40 秒 则该步骤将失败 并显示错误消息 操作已超时 该程
  • 检测类型是否是“映射”

    我想使用它们将 C 容器解析为另一个对象 iterator会员类型 迭代器成员类型指向单一类型 向量 队列等 对象的容器将变成类列表对象 迭代器成员类型指向单一类型对象的容器std pair将变成一个类似地图的物体 我试图编写一个成员函数来
  • Polymer,如何等待 core-ajax 完成后再渲染其他元素?

    更新 以下是针对这种情况的文档 条件模板使用 if 属性有条件地创建模板实例 这个应用程序 plnkr co 应执行以下操作 使用 core ajax 组件从数据库获取project location 本例中为JSON 使用 google
  • 如何在 Eclipse 中打印到 textArea 而不是控制台?

    我目前有一个程序 可以以各种方式将文本行打印到屏幕上 例如 System out println 语句 并且 for 循环将数组中的所有元素打印到屏幕上 我现在在一个单独的类中向该程序添加一个 GUI 我的问题是我想将打印到 Eclipse
  • 带坐标的平铺网格

    我正在尝试创建一个可以用 with 或 height 指定的网格 即 10 个框宽 x 20 个高 我已经创建了一个创建网格的脚本 但我想以一种可以以与我的方式不同的宽度和高度创建网格的方式进行制作 它当前创建一个宽度与高度相等的网格 并且
  • CryptoStream 没有像预期那样刷新

    我正在处理的 C NET Framework 4 5 代码应该允许我通过加密流将文本传输到另一个程序 我创建了两个简单的程序来演示我的问题 EncryptionTestA 是服务器 并且应该首先运行 EncryptionTestB 是客户端
  • 使用 Boost gzip_decompressor 解压缩内存中的数据

    我正在尝试使用 Boost 解压缩内存中的二进制数据gzip decompressor From 这个答案 我改编了以下代码 vector
  • 使用 Google 幻灯片中的应用程序脚本将 pageElements 置于前面或后面

    堆叠顺序由它们插入幻灯片的顺序决定 但是 幻灯片中的某些页面元素仍然隐藏 有没有办法使用应用程序脚本更改 Google 幻灯片中对象的顺序 这个解决方法怎么样 我和你经历过同样的情况 当时 我已经使用此解决方法移动了该元素 我认为针对这种情
  • 重新加载不同的表视图单元格后,NSOutlineView 行不再可以通过“Return”键编辑

    我遇到了最奇怪的问题NSOutlineView 一切都在故事板中设置 即大纲视图和两个NSTableCellViews 两个单元格视图基本相同 只有一个显示图标 另一个不显示 我可以通过按开始编辑项目 行 Return键 即NSTextFi