Skip to content


Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Customized text fields used in the iCook app.

Build Status Carthage compatible CocoaPods Compatible Platform Swift 5


  • A text field that has a button to dismiss keyboard on the input accessory view.


  • A horizontal scrolling UI that groups input texts.
  • Easy to add, select and delete tokens.
  • Customizable icon and colors.
  • Supports storyboard.



  • An easy to use UIControl that displays a UIPickerView with given options.


ICInputAccessory iOS Xcode Swift
~> 1.0.0 8.0+ 7.2 Swift 2.1.1
~> 1.1.0 8.0+ 7.3 Swift 2.2
~> 1.2.0 8.0+ 8.0 Swift 2.3
~> 1.3.0 8.0+ 8.0 Swift 3.0
~> 1.4.0 8.0+ 8.3 Swift 3.1
~> 1.5.0 8.0+ 9.3 Swift 4.1
~> 2.0.0 8.0+ 10.0 Swift 4.1
develop 8.0+ 11.1 Swift 5.0


Use Carthage

Create a Cartfile with the following specification and run carthage update ICInputAccessory. Follow the instructions to add the framework to an iOS project.

github "polydice/ICInputAccessory"

Use CocoaPods

ICInputAccessory supports subspecs. Create a Podfile with the following specification and run pod install.

platform :ios, '8.0'

pod 'ICInputAccessory/TokenField'
pod 'ICInputAccessory/KeyboardDismissTextField'

Use Git Submodule

git submodule add -b master Dependencies/ICInputAccessory
  • Everything you need resides in the Source directory. Add those files to your project.
  • Alternatively, drag ICInputAccessory.xcodeproj to your app project as a subproject. Add ICInputAccessory-iOS to the Target Dependencies in the application target's Build Phases settings.



let textField = KeyboardDismissTextField(frame: rect)


let tokenField = TokenField(frame: rect)
tokenField.delegate = self as? TokenFieldDelegate

The characters that complete a token:

/// Characters that complete a new token, defaults are whitespace and commas.
public var delimiters: [String]


/// Texts of each created token.
public var texts: [String] { get }

/// Creates a token with the current input text.
public func completeCurrentInputText()

/// Removes the input text and all displayed tokens.
public func resetTokens()

UI customization:

/// The image on the left of text field.
public var icon: UIImage? { get set }

/// The placeholder with the default color and font.
public var placeholder: String? { get set }

/// The placeholder with customized attributes.
public var attributedPlaceholder: NSAttributedString? { get set }

/// Customized attributes for tokens in the normal state, e.g. .font and .foregroundColor.
public var normalTokenAttributes: [NSAttributedStringKey : NSObject]? { get set }

/// Customized attributes for tokens in the highlighted state.
public var highlightedTokenAttributes: [NSAttributedStringKey : NSObject]? { get set }

Customizable properties in storyboard:

@IBInspectable var icon: UIImage?
@IBInspectable var placeholder: String?
@IBInspectable var textColor: UIColor?
@IBInspectable var cornerRadius: CGFloat

See Example/CustomizedTokenField.swift for more details.


TokenField currently notifies its delegate the following events:

@objc optional func tokenFieldDidBeginEditing(_ tokenField: TokenField)
@objc optional func tokenFieldDidEndEditing(_ tokenField: TokenField)
@objc optional func tokenFieldWillReturn(_ tokenField: TokenField)
@objc optional func tokenField(_ tokenField: TokenField, didChangeInputText text: String)
@objc optional func tokenField(_ tokenField: TokenField, shouldCompleteText text: String) -> Bool
@objc optional func tokenField(_ tokenField: TokenField, didCompleteText text: String)
@objc optional func tokenField(_ tokenField: TokenField, didDeleteText text: String, atIndex index: Int)

The displayed delimiter string can be customized by:

@objc optional func tokenField(_ tokenField: TokenField, subsequentDelimiterForCompletedText text: String) -> String


An example type that conforms to OptionDescriptive:

extension String: OptionDescriptive {

  var title: String {
    return self

  static var titleForOptionalValue: String {
    return "(optional)"


To initialize OptionPickerControl with and add it to the view hierarchy:

let optionPicker = OptionPickerControl<String>()
optionPicker.options = [.optional, Option("Option 1"), Option("Option 2")]
optionPicker.addTarget(self, action: #selector(didChangeOption(_:)), for: .valueChanged)

To show the UIPickerView:




  • Set up dependencies by running the following command in the project root:

    make bootstrap
  • Open ICInputAccessory.xcworkspace and run the demo app with the Example scheme.

  • See more tasks for building and testing:

    rake -T


Thank you for being interested in contributing to this project. We'd love to hear your ideas!

Please fork this repository, create a branch named like feature/some-new-feature and send us a pull request to make this project better.


Twitter Join the chat at


Copyright (c) 2016 Polydice, Inc.

ICInputAccessory is released under the MIT license. See LICENSE for details.