一个对 NSTokenField 的 Swift 扩展,使其高度可定制,并消除了其实现中的大量样板代码。
shouldDisplayClearButton
、shouldDisplaySearchIcon
、leftView
、shouldEnableTokenMenu
等。NSTokenField
处理。请参阅下面提供的演示(1 - 3)。NSTokenFieldDelegate
。只需设置 tokenDelegate
并像往常一样实现这些方法(参见 gif4)。selectedTokenIndex
的支持,以便可以根据索引自定义令牌。NSTokenFieldDelegate
方法中提供的 tokenIndex
存在错误,因此总是返回零。selectedTokenIndex
将在此期间提供帮助。representedObject
参数获取 tokenIndex
。
可以使用 Carthage、Cocoapods 或 Swift Package Manager 将其集成到项目中。
github "akhilcb/ACBTokenField" ~> 2.3.0
pod 'ACBTokenField', '~> 2.3.0'
dependencies: [
.Package(url: "https://github.com/akhilcb/ACBTokenField.git", majorVersion: 2)
]
为了在项目中实现这一点,只需复制文件 NSTokenField+ACBExtension.swift
、ACBAssociation.swift
、ACBToken.swift
,并在任何 NSTokenField
上调用以下函数。如上所述,无需子类化或更改 XIB 或 Storyboard 文件。
tokenField.convertToACBTokenField()
如果您希望在 tokenfield 中有清除按钮和/或搜索图标,您可以从 Assets.xcassets 复制图标 ClearDarkGray
和 Glass
。 否则,您可以使用自己的图像并设置 NSTokenField
的属性 clearIconName
和 searchIconName
。 就可以开始了。
注意:单元格类将动态更改为 ACBTokenFieldCell
,并且将设置 delegate
。 请不要修改这些属性。 请使用 tokenDelegate
代替 delegate
。
还有其他功能可以利用,例如设置令牌名称列表数组,该数组表示令牌字段每个索引处的令牌列表。 在这种情况下,您不必实现 NSTokenField 委托。 这将负责显示建议/显示令牌上的菜单/编辑令牌等。
tokenField.tokenKeywordsList = [["France", "Germany", "Italy", "USA", "Spain", "India", "Brazil"],
["Pizza", "Pasta", "Butter Chicken", "Jamon", "Cheesecake"],
["Deer", "Dog", "Bear", "Panda", "Jaguar", "Bull"],
["Car", "Truck", "Bus", "Motorcycle", "Minivan"]]
如上所示设置一个数组,它将根据上面的列表显示建议/菜单。 上面的列表在索引 0 处显示国家名称,在索引 1 处显示食物名称,在索引 2 处显示动物名称等。 如果您不想像这样为每个索引单独定义令牌建议,则可以利用以下属性,为除上面存在的那些索引之外的所有其他索引提供默认建议。
tokenField.defaultTokenKeywords = ["Red", "Blue", "Green", "White", "Purple", "Black"]
这将为 tokenKeywordsList
中未指定索引的 tokenField 中的所有其他令牌显示默认建议和令牌菜单。
您还可以将令牌字段的 leftView
属性设置为任何 NSView
或 NSView
的子类。 例如:- 您可以将一个 NSButton
添加为 leftView
,并对其设置一个操作(请参阅 gif5)。
//set any required properties
tokenField.shouldEnableTokenMenu = true
tokenField.tokenDelegate = self
tokenField.leftView = lockButton
tokenField.didDeleteTokenBlock = { (tokenIndex, _) in
print("Token at index = ", tokenIndex, "is removed")
}
public func tokenField(_ tokenField: NSTokenField, completionsForSubstring substring: String, indexOfToken tokenIndex: Int, indexOfSelectedItem selectedIndex: UnsafeMutablePointer<Int>?) -> [Any]? {
switch tokenIndex {
case 0:
return actors
case 1:
return actresses
case 2:
return movies
case 3:
return years
default:
return nil
}
}
MIT 许可证
版权所有 (c) 2017, Akhil C Balan(https://github.com/akhilcb)
保留所有权利。