Skip to content

Commit 25b7601

Browse files
committed
Merge branch 'feature/delimiter-label' into develop
Close #11
2 parents 8db33fd + 3555d41 commit 25b7601

File tree

5 files changed

+48
-24
lines changed

5 files changed

+48
-24
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
```swift
66
@objc optional func tokenField(_ tokenField: ICTokenField, didChangeInputText text: String)
77
@objc optional func tokenField(_ tokenField: ICTokenField, shouldCompleteText text: String) -> Bool
8+
@objc optional func tokenField(_ tokenField: ICTokenField, subsequentDelimiterForCompletedText text: String) -> String
89
```
910

1011
* Changed delegate method:

Example/CustomizedTokenViewController.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class CustomizedTokenViewController: UIViewController, ICTokenFieldDelegate {
3737
override func loadView() {
3838
super.loadView()
3939
view.backgroundColor = UIColor.white
40+
textView.isEditable = false
41+
textView.isSelectable = false
4042
textView.text = "[\n\n]"
4143
textView.font = UIFont.preferredFont(forTextStyle: .subheadline)
4244
textView.frame = view.bounds.insetBy(dx: 10, dy: 10)
@@ -102,6 +104,10 @@ class CustomizedTokenViewController: UIViewController, ICTokenFieldDelegate {
102104
updateTexts()
103105
}
104106

107+
func tokenField(_ tokenField: ICTokenField, subsequentDelimiterForCompletedText text: String) -> String {
108+
return " ,"
109+
}
110+
105111
// MARK: - UIResponder Callbacks
106112

107113
@objc fileprivate func dismiss(_ sender: UIBarButtonItem) {

README.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,21 @@ See `Example/CustomizedTokenField.swift` for more details.
132132

133133
`ICTokenField` currently notifies its delegate the following events:
134134

135-
* `tokenFieldDidBeginEditing(_:)`
136-
* `tokenFieldDidEndEditing(_:)`
137-
* `tokenFieldWillReturn(_:)`
138-
* `tokenField(_:didChangeInputText:)`
139-
* `tokenField(_:shouldCompleteText:)`
140-
* `tokenField(_:didCompleteText:)`
141-
* `tokenField(_:didDeleteText:atIndex:)`
135+
```swift
136+
@objc optional func tokenFieldDidBeginEditing(_ tokenField: ICTokenField)
137+
@objc optional func tokenFieldDidEndEditing(_ tokenField: ICTokenField)
138+
@objc optional func tokenFieldWillReturn(_ tokenField: ICTokenField)
139+
@objc optional func tokenField(_ tokenField: ICTokenField, didChangeInputText text: String)
140+
@objc optional func tokenField(_ tokenField: ICTokenField, shouldCompleteText text: String) -> Bool
141+
@objc optional func tokenField(_ tokenField: ICTokenField, didCompleteText text: String)
142+
@objc optional func tokenField(_ tokenField: ICTokenField, didDeleteText text: String, atIndex index: Int)
143+
```
144+
145+
The displayed delimiter string can be customized by:
146+
147+
```swift
148+
@objc optional func tokenField(_ tokenField: ICTokenField, subsequentDelimiterForCompletedText text: String) -> String
149+
```
142150

143151
## Development
144152

Source/TokenField/ICToken.swift

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ class ICToken: UIView {
6363
// MARK: - Private Properties
6464

6565
private(set) lazy var delimiterLabel: UILabel = {
66-
let _delimiter = UILabel()
67-
_delimiter.text = " , "
68-
_delimiter.textColor = self.normalTextAttributes[NSForegroundColorAttributeName] as? UIColor
69-
return _delimiter
66+
let _label = UILabel()
67+
_label.textColor = self.normalTextAttributes[NSForegroundColorAttributeName] as? UIColor
68+
_label.textAlignment = .right
69+
return _label
7070
}()
7171

7272
private(set) lazy var textLabel: UILabel = {
@@ -90,16 +90,15 @@ class ICToken: UIView {
9090
setUpSubviews()
9191
}
9292

93-
convenience init(text: String, normalAttributes: [String: NSObject]? = nil, highlightedAttributes: [String: NSObject]? = nil) {
93+
convenience init(text: String, delimiter: String = ",", normalAttributes: [String: NSObject]? = nil, highlightedAttributes: [String: NSObject]? = nil) {
9494
self.init()
9595
if let attributes = normalAttributes { normalTextAttributes = attributes }
9696
if let attributes = highlightedAttributes { highlightedTextAttributes = attributes }
97-
// didSet is not called within the initializer
98-
setText(text)
99-
}
100-
101-
private func setText(_ text: String) {
102-
self.text = text
97+
delimiterLabel.text = delimiter
98+
({
99+
// Workaround to trigger didSet inside the initializer
100+
self.text = text
101+
})()
103102
}
104103

105104
// MARK: - Private Methods
@@ -127,7 +126,7 @@ class ICToken: UIView {
127126
"text": textLabel,
128127
"delimiter": delimiterLabel
129128
]
130-
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[text][delimiter]|",
129+
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[text][delimiter]-5-|",
131130
options: [.alignAllCenterY],
132131
metrics: nil,
133132
views: views

Source/TokenField/ICTokenField.swift

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ import UIKit
4242
@objc optional func tokenField(_ tokenField: ICTokenField, didCompleteText text: String)
4343
/// Tells the delegate that the token at certain index is removed from the token field.
4444
@objc optional func tokenField(_ tokenField: ICTokenField, didDeleteText text: String, atIndex index: Int)
45+
/// Asks the delegate for the subsequent delimiter string for a completed text in the token field.
46+
@objc optional func tokenField(_ tokenField: ICTokenField, subsequentDelimiterForCompletedText text: String) -> String
4547
}
4648

4749

@@ -299,12 +301,12 @@ open class ICTokenField: UIView, UITextFieldDelegate, ICBackspaceTextFieldDelega
299301
}
300302

301303
let index = text.index(text.endIndex, offsetBy: -delimiter.characters.count)
302-
let newToken = text.substring(to: index)
304+
let newText = text.substring(to: index)
303305

304-
if !newToken.isEmpty && newToken != delimiter && (delegate?.tokenField?(self, shouldCompleteText: newToken) ?? true) {
305-
tokens.append(ICToken(text: newToken, normalAttributes: normalTokenAttributes, highlightedAttributes: highlightedTokenAttributes))
306+
if !newText.isEmpty && newText != delimiter && (delegate?.tokenField?(self, shouldCompleteText: newText) ?? true) {
307+
tokens.append(customizedToken(with: newText))
306308
layoutTokenTextField()
307-
delegate?.tokenField?(self, didCompleteText: newToken)
309+
delegate?.tokenField?(self, didCompleteText: newText)
308310
}
309311

310312
textField.text = nil
@@ -373,6 +375,14 @@ open class ICTokenField: UIView, UITextFieldDelegate, ICBackspaceTextFieldDelega
373375

374376
// MARK: - Private Methods
375377

378+
private func customizedToken(with text: String) -> ICToken {
379+
if let string = delegate?.tokenField?(self, subsequentDelimiterForCompletedText: text) {
380+
return ICToken(text: text, delimiter: string, normalAttributes: normalTokenAttributes, highlightedAttributes: highlightedTokenAttributes)
381+
} else {
382+
return ICToken(text: text, normalAttributes: normalTokenAttributes, highlightedAttributes: highlightedTokenAttributes)
383+
}
384+
}
385+
376386
/// Returns true if any highlighted token is found and removed, otherwise false.
377387
private func removeHighlightedToken() -> Bool {
378388
for (index, token) in tokens.enumerated() {
@@ -452,7 +462,7 @@ open class ICTokenField: UIView, UITextFieldDelegate, ICBackspaceTextFieldDelega
452462
}
453463

454464
inputTextField.text = nil
455-
tokens.append(ICToken(text: text, normalAttributes: normalTokenAttributes, highlightedAttributes: highlightedTokenAttributes))
465+
tokens.append(customizedToken(with: text))
456466
layoutTokenTextField()
457467
delegate?.tokenField?(self, didCompleteText: text)
458468
}

0 commit comments

Comments
 (0)