- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 NSTextView
字段,它在用户输入时过滤一个 NSTable
表。我已经成功实现了表过滤。
现在,我的目标是自动选择第一个结果(表中的第一行)并允许用户在键入搜索查询时使用箭头键在结果之间移动。在表中的结果之间移动时,输入字段应保持焦点。 (这类似于 Spotlight 的工作方式)。
这是应用程序现在的样子:
这是我的ViewController
:
import Cocoa
class ViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate, NSTextFieldDelegate {
@IBOutlet weak var field: NSTextField!
@IBOutlet weak var table: NSTableView!
var projects: [Project] = []
override func viewDidLoad() {
super.viewDidLoad()
projects = Project.all()
field.delegate = self
table.dataSource = self
table.delegate = self
}
override func controlTextDidChange(_ obj: Notification) {
let query = (obj.object as! NSTextField).stringValue
projects = Project.all().filter { $0.title.contains(query) }
table.reloadData()
}
func numberOfRows(in tableView: NSTableView) -> Int {
return projects.count
}
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "FirstCell"), owner: nil) as? NSTableCellView {
cell.textField?.stringValue = projects[row].title
return cell
}
return nil
}
}
这是Project
类
struct Project {
var title: String = ""
static func all() -> [Project] {
return [
Project(title: "first project"),
Project(title: "second project"),
Project(title: "third project"),
Project(title: "fourth project"),
];
}
}
谢谢
最佳答案
这个有点,在@Willeke 发布的副本中已经有一个答案,但是 1) 这个答案是在 Objective-C 中,而不是 Swift,2) 我可以提供更详细的答案(有图片!),和3) 我正在厚颜无耻地追求赏金(收购规则 #110)。因此,考虑到这一点,以下是我将如何实现您想要做的事情:
不要使用 NSTextView
;使用 NSTextField
,或者更好的是 NSSearchField
。 NSSearchField
很棒,因为我们可以在 Interface Builder 中设置它来创建过滤器谓词,几乎不需要代码。为此,我们要做的就是在我们的 View Controller 中创建一个 NSPredicate
属性,然后设置搜索字段的 Bindings Inspector 以指向它:
然后您可以创建一个 Array Controller,将其 Filter Predicate 绑定(bind)到同一属性,并将其 Content Array
绑定(bind)绑定(bind)到 View Controller 上的属性:
当然,还要将 TableView 绑定(bind)到数组 Controller :
最后但同样重要的是,将表格单元格 View 中的文本字段绑定(bind)到 title
属性:
在 Interface Builder 中完成所有设置后,我们几乎不需要任何代码。我们只需要定义 Project
类(所有属性都需要标记为 @objc
以便 Cocoa Bindings 系统可以看到它们):
class Project: NSObject {
@objc let title: String
init(title: String) {
self.title = title
super.init()
}
}
我们还需要在我们的 View Controller 上为项目、数组 Controller 和过滤器谓词设置属性。过滤器谓词需要是动态的
,以便 Cocoa Bindings 在更改和更新 UI 时可以得到通知。如果 projects
可以改变,也让 dynamic
发生变化,这样对它的任何改变都会反射(reflect)在 UI 中(否则,你可以去掉 dynamic
然后让它成为 @objc let
)。
class ViewController: NSViewController {
@IBOutlet var arrayController: NSArrayController!
@objc dynamic var projects = [
Project(title: "Foo"),
Project(title: "Bar"),
Project(title: "Baz"),
Project(title: "Qux")
]
@objc dynamic var filterPredicate: NSPredicate? = nil
}
最后但并非最不重要的一点是,我们的 View Controller 上的扩展使其符合 NSSearchFieldDelegate
(或 NSTextFieldDelegate
,如果您使用的是 NSTextField
而不是 NSSearchField
),我们将在其上实现 control(:textView:doCommandBy:)
方法。基本上我们拦截由搜索字段的字段编辑器执行的文本编辑命令,如果我们得到 moveUp:
或 moveDown:
,返回 true
到告诉现场编辑器我们将改为处理这些命令。对于这两个选择器以外的所有内容,返回 false
以告诉字段编辑器执行它通常执行的操作。
请注意,这就是您应该使用 NSTextField
或 NSSearchField
而不是 NSTextView
的原因;此委托(delegate)方法只会为 NSControl
子类调用,而 NSTextView
则不会。
extension ViewController: NSSearchFieldDelegate {
func control(_: NSControl, textView _: NSTextView, doCommandBy selector: Selector) -> Bool {
switch selector {
case #selector(NSResponder.moveUp(_:)):
self.arrayController.selectPrevious(self)
return true
case #selector(NSResponder.moveDown(_:)):
self.arrayController.selectNext(self)
return true
default:
return false
}
}
}
瞧!
(当然,如果你更喜欢手动填充表格 View 而不是使用绑定(bind),你可以忽略大部分内容并只实现 control(:textView:doCommandBy:)
,更新表格的选择手动而不是要求你的数组 Controller 来做。当然,使用绑定(bind)会产生漂亮、干净的代码,这就是我喜欢它的原因。)
关于swift - 在输入 NSTextField 时过滤 NSTable - 自动选择第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481006/
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
我有一个表student,其中的列dte_date(日期)具有值(2019-01-01、2019-02-01、2019-03-01)。 .等) 条件: dte_date 列中没有重复值。 但 dte_
我有一些逻辑可以根据不活动的用户创建通知。我正在获取具有以下属性的用户列表。我想做的只是在部门有非 Activity 用户时触发我的创建通知方法。因此,给出下面的列表,基本上会创建 1 个通知,表示部
使用 GPS 开发跟踪应用程序。一切都很好,但有时由于封闭区域或恶劣天气,我得到的分数不准确。当您绘制它们时,它看起来不对,有很多跃点/跳跃。 我应该运行什么算法来过滤掉不良信号对我来说,这看起来像是
我正在尝试按变量类型过滤对象数组。节点是一个具有位置的对象,但以不同的方式定义——作为点、矢量或附件。这是一个代码: class Joint { var position:Position
我想做的是在向量上创建一个过滤器,以便它删除未通过谓词测试的元素;但不太确定我该怎么做。 我根据谓词评估输入向量中的每个元素,例如在我的代码中,is_even 仿函数在 device_vector 向
我是 Gremlin 的新手,我正在使用 Gremlin 3.0.2 和 Stardog 5.0。我编写此查询是为了找出 schema.org 本体中两个实体之间的路径。以下是输出 - gremlin
考虑以下示例数据表, dt 30 的那一行需要去 - 或者如果其中两行 > 30相隔几秒钟,删除所有 3 个。然而 ,当我们有 4 行或更多行时,我们需要删除时间差 > 30 没有另一对 < 30
我正在考虑使用 ZeroMQ,并尝试了一些示例。但是,我无法验证 ZeroMQ 是否支持一些重要的要求。我希望你能帮助我。 我将使用这个简单的场景来问我的问题: 出版商(例如交易所)提供(大量)股票的
我需要从我的查询中过滤掉大量的对象。目前,它正在抓取类中的所有对象,我想将其过滤为查询字符串中的相关对象。我怎样才能做到这一点?当我尝试时,我收到一个属性错误说明 ''QuerySet' object
如何在 Prometheus 查询中添加标签过滤器? kube_pod_info kube_pod_info{created_by_kind="ReplicaSet",created_by_name=
我有包含字符串的列的数据框,并希望过滤掉包含某些字符串以外的任何内容的所有行。考虑下面的简化示例: string % dplyr::filter(stringr::str_detect(string,
我有以下数据框,其中包含多行的角度变化值: 'data.frame': 712801 obs. of 4 variables: $ time_passed: int 1 2 3 4 5 6
我有一个 BehaviorSubject我希望能够filter ,但要保持新订阅者在订阅时始终获得一个值的行为主题式质量,即使最后发出的值被过滤掉。有没有一种简洁的方法可以使用 rxjs 的内置函数来
我有一个 RSS 提要,每天输出大约 100 篇文章。我希望过滤它以仅包含更受欢迎的链接,也许将其过滤到 50 个或更少。回到当天,我相信您可以使用“postrank”来做到这一点,但在谷歌收购后现已
我有这样一个重复的xml树- this is a sample xml file yellowred blue greyredblue 如您所见,每个项目可以具有不同数量的颜色标签
我以为我在 Haskell 学习中一帆风顺,直到... 我有一个 [[Int]] tiles = [[1,0,0] ,[0,1,0] ,[0,1,0]
我在使用 Knockout.js 过滤可观察数组时遇到问题 我的js: 包含数据的数组 var docListData = [ { name: "Article Name 1", info:
我在 mongoDB 中有这个架构: var CostSchema = new Schema({ item: String, value: Number }); var Attachm
给定一个数据框“foo”,我如何才能只选择“foo”中的那些行,例如foo$location =“那里”? foo = data.frame(location = c("here", "there",
我是一名优秀的程序员,十分优秀!