在Mail的NSTokenField中输入无效的电子邮件时,得到这个(令牌和纯字符串值的混合):
有没有可行的方法来实现这一目标?
NSTokenField甚至是正确的工具吗?或者我会滥用它?
在这个特定的项目中,我需要允许用户输入文件名模式
(虽然还有其他一些用例),并支持预定义的令牌.
现在我要求输入如下:
Glue Text %[Tag]Other Glue Text%[Another Tag]More Text
Run Code Online (Sandbox Code Playgroud)
我想将此更改为一些这样的防呆图形解决方案:
NSTokenField总是(!)将输入的文本转换为标记.
我在网络搜索中使用了错误的关键字,
或者我真的是第一个需要这种(混合)行为的人?!
我确实通过Apple的NSTokenField指南阅读,但找不到有关我的问题的任何信息.
Apple已经方便地创建了一个回调方法,允许您检查添加到NSTokenField的新令牌是否有效:
- (NSArray *)tokenField:(NSTokenField *)tokenField shouldAddObjects:(NSArray *)newTokens atIndex:(NSUInteger)index
Run Code Online (Sandbox Code Playgroud)
我已经实现了这一点,事实证明它除了在一个案例中之外效果很好.如果用户开始键入令牌但尚未完成键入令牌,并且用户按下TAB键,则不会调用验证方法.
这意味着我能够确保输入的所有令牌都是有效的,除非用户计算出来,他们可以按Tab键绕过验证.
有谁知道处理这种情况的正确方法是什么?
我试图在10.7+上模拟Mail.app和Finder.app的标记化搜索功能,其中看起来像是一个NSSearchField,左边是搜索放大镜图标,右边是cancel(x)按钮,但是还包括搜索字段内的标记.
有没有办法让NSSearchField使用NSTokenFieldCell而不是NSSearchFieldCell?我已经尝试调用-setCell:
NSSearchField实例,该实例可以通过调用po [searchField cell]
调试器来替换单元格,但是搜索字段的绘制中断并且没有绘制文本字段.
我是以正确的方式接近这个还是有更好的方法来做到这一点?谢谢!
2016年10月25日更新:使用辅助功能检查器我发现Finder和Mail使用混合私有子类:
SGTSearchField : NSSearchField
SGTSearchFieldCell : NSSearchFieldCell
SGTTokenFieldCell : NSTokenFieldCell
这些是名为的私有框架的一部分Suggestions.framework
.希望Apple将来能够公开这些课程.如果您希望公开此功能,请确保提交雷达.
我在弄清楚如何在NSTokenField中表示多对多关系模型时遇到了问题.我有两个(相关)模型:
物品标签
一个项目可以有很多标签,一个标签可以有很多项目.所以这是一种反多种关系.
我想做的是在NSTokenField中表示这些标签.我想最终得到一个令牌字段自动建议匹配(找到一种方法来使用tokenfield:completionsForSubstring:indexOfToken:indexOfSelectedItem)并且能够添加新标记实体(如果它与现有标记不匹配).
好的,希望你还在我身边.我试图用绑定和数组控制器来做所有这些(因为这最有意义,对吧?)
我有一个数组控制器,"项目数组控制器",绑定到我的应用程序委托managedObjectContext.显示所有项目的tableview具有与此阵列控制器的绑定.
我的NSTokenField的值绑定了数组控制器选择键和模型键路径:标签.
使用此配置,NSTokenField将不显示标记.它只是给了我:
<NSTokenFieldCell: 0x10014dc60>: Unknown object type assigned (Relationship objects for {(
<NSManagedObject: 0x10059bdc0> (entity: Tag; id: 0x10016d6e0 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Tag/p102> ; data: <fault>)
)} on 0x100169660). Ignoring...
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,所以不用担心.我查看了一些NSTokenField委托方法,似乎我应该使用:
- (NSString *)tokenField:(NSTokenField *)tokenField displayStringForRepresentedObject:(id)representedObject
Run Code Online (Sandbox Code Playgroud)
问题是,这个方法没有被调用,我得到了和以前一样的错误.
好吧,所以我的下一步是尝试创建一个ValueTransformer.从带有标记实体的数组转换 - >带有字符串的数组(标记名称)都很好.另一种方式更具挑战性.
我试过的是在我的共享应用程序委托管理对象上下文中查找每个名称并返回匹配的标记.这显然给我一个不同的托管对象上下文的问题:
Illegal attempt to establish a relationship 'tags' between objects in different contexts (source = <NSManagedObject: 0x100156900> (entity: Item; id: 0x1003b22b0 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Item/p106> ; data: {
author = "0x1003b1b30 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Author/p103>";
createdAt = nil;
filePath = nil;
tags = ( …
Run Code Online (Sandbox Code Playgroud) 我有一个NSTokenField
允许用户选择联系人(就像在Mail.app中一样).所以NSTextField绑定到我的model.recipient
实例变量中的数组.
用户现在可以从自动完成列表中选择一个条目,例如Joe Bloggs: joe@blogs.com
,一旦他点击Enter,(Joe Bloggs)
就会显示该标记,并且model.recipients
现在包含一个BBContact
条目.
现在,如果用户开始键入一些键(因此显示了建议)然后点击Tab而不是输入令牌,(Joe Bloggs: joe@bloggs.com)
并且创建了完成文本的值,并且NSTokenFieldDelegate
没有调用方法,因此我可以响应此事件.该model.recipient
条目现在包含一个NSString
而不是一个BBContact
条目.
奇怪的是,委托方法tokenField:shouldAddObjects:atIndex:
没有被调用,这是我在用户标记出令牌字段时所期望的.
我想要一个文本字段,如Numbers中的表达式编辑器文本字段:
它非常相似NSTokenField
,但NSTokenField
只支持分隔符分隔的标记列表,如Mail.app中的"To:"字段.
我必须将这些令牌嵌入到特定位置的文本中,否则它们的工作方式完全相同NSTokenField
(退格会删除令牌,您可以将它们拖动等等).
有没有第一方或第三方控制做这样的事情?我没找到任何东西.
如果没有,你会如何推荐实施它?使用核心文本并重新发明轮子(实现NSTextField
更好的令牌支持)?或者有更好的解决方案吗?
我能够使用NSTokenField,它很容易使用..但我想知道如何自定义它就像它在mac邮件中的"To/CC"字段中那样.什么时候没有 令牌字段中的令牌增加"To"字段的高度增加到某个限制然后垂直卷轴开始出现!
默认情况下,当我们使用标记字段时,其高度不会增加,也不会出现垂直滚动条!我在IB中尝试了不同的组合,但我无法获得类似功能的mac邮件.
谁能建议我一些解决方案?
我对cocoa很陌生,我正试图找出如何在Mavericks中创建类似于新标记UI的东西:
我假设,我将不得不覆盖NSTokenFieldCell以获得彩色圆点或标签上的图标.但是这个弹出列表如何工作?
谢谢你的帮助!
我想实现一个NSTokenField,它将显示令牌 - 当鼠标悬停在令牌上时 - 显示一个删除图标.随后当我点击图标时,我希望删除令牌.
经过大量搜索后,似乎标准NSTokenField无法实现这一点.如果有人知道如何请让我知道.
我查看了https://github.com/octiplex/OEXTokenField,并根据该代码在Swift中创建了一个CustomTokenField实现.到目前为止,我有一个工作的CustomTokenField,当我将鼠标悬停在令牌上时,它会显示一个删除图标.
下一阶段结果是一个我无法弄明白的问题.如何点击令牌触发回调.?
令牌类派生自NSTextAttachmentCell,CustomTokenField派生自NStokenField:
class CustomTokenAttachmentCell: NSTextAttachmentCell {
. . .
}
class CustomTokenField: NSTokenField {
. . .
}
Run Code Online (Sandbox Code Playgroud)
我试图用两个不同的角度来解决这个问题:
NSTextAttachmentCell实现NSTextAttachmentCellProtocol.
public protocol NSTextAttachmentCellProtocol : NSObjectProtocol {
. . .
public func wantsToTrackMouse() -> Bool
public func highlight(flag: Bool, withFrame cellFrame: NSRect, inView controlView: NSView?)
public func trackMouse(theEvent: NSEvent, inRect cellFrame: NSRect, ofView controlView: NSView?, untilMouseUp flag: Bool) -> Bool
. …
Run Code Online (Sandbox Code Playgroud) cocoa ×10
nstokenfield ×10
objective-c ×6
appkit ×1
apple-mail ×1
core-data ×1
macos ×1
nscell ×1
nsscroller ×1
nstextfield ×1
swift ×1