open class FUISearchToSelectViewController : UIViewController, UITableViewDataSource, UITableViewDelegate

A view controller which specializes in managing a tags field and a table view. Selected table view cell will appear in tags field with a designated tag. You can also deselect a table view cell by deleting its designated tag in tags field. In order to make this work, your subclass must implement FUISearchToSelectViewDelegate delegate.


  • searchToSelectView
  • tagsField
  • tableView


Subclassing and conforms to delegate. It conforms to UITableViewDataSource and UITableViewDelegate by default.

class MyController: FUISearchToSelectViewController, FUiSearchToSelectViewDelegate {}

Override viewDidLoad and do some setup here

override func viewDidLoad() {
    self.tableView.register(FUIObjectTableViewCell.self, forCellReuseIdentifier: FUIObjectTableViewCell.reuseIdentifier)
    self.tableView.register(FUITableViewHeaderFooterView.self, forHeaderFooterViewReuseIdentifier: FUITableViewHeaderFooterView.reuseIdentifier)
    self.tableView.rowHeight = UITableView.automaticDimension
    self.tableView.estimatedRowHeight = 50
    // ...

Implement dataSource and delegate methods

// Define data model.
var objects: [ModelObj] = []

// UITableView dataSource and delegate methods
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return objects.count

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: FUIObjectTableViewCell.reuseIdentifier, for: indexPath) as! FUIObjectTableViewCell
    let model = objects[indexPath.row]

    cell.isMomentarySelection = false
    cell.selectionStyle = .none
    cell.detailImage = model.image
    cell.detailImageView.isCircular = true
    cell.headlineText = model.headline
    cell.subheadlineText = model.subheadline
    cell.footnoteText = model.footnote

    return cell

// FUISearchtoSelectViewControllerDelegate delegate
func searchToSelectView(_ searchToSelectView: FUISearchToSelectView, uuidForItemAt indexPath: IndexPath) -> String? {
    let obj = objects[indexPath.row]
    return obj.uuid

func searchToSelectView(_ searchToSelectView: FUISearchToSelectView, tagTitleFor itemUUID: String) -> String? {
    if let obj = objects.filter ({ $0.uuid == itemUUID }).first {
        return obj.headline
    return nil


Developer is responsible for updating selectedUUIDs after data changes to make sure all selected UUIDs are still valid.


Supported class paths:

fdlFUISearchToSelectViewController_searchToSelectView {}
fdlFUISearchToSelectViewController_tableView {}
fdlFUISearchToSelectViewController_tagsField {}

Supported TagsField attributes:

tint-color (Color)
background-color (Color)
content-insets (Box)
font-color { -placeholder } (Color)
font-name (FontName)
font-style (UIFontTextStyle)
font-size (Number)
text-line-clamp (Integer)
line-spacing (Float)
tag-spacing (Float)
tag-delimiter (String)

Supported Tag attributes:

tag-font-color { -selected } (Color)
tag-background-color { -selected } (Color)
tag-content-insets (Box)

Supported ImageView attributes:

search-icon-image (Image)
search-icon-image-tint-color (Color)
  • The tags field of the controller.



    public var tagsField: FUISearchTagsField { get }
  • The table view of the controller.



    public var tableView: UITableView! { get }
  • The default implementation of this method does nothing. Subclasses should override it to perform additional actions whenever selected uuids changes.



    open func selectedUUIDsDidChange()
  • UUIDs for selected cells. If you have multiple uuid to append to this array, batch them up into one operation instead of appending one at a time.



    open var selectedUUIDs: [String] { get set }
  • The object that acts as the delegate of the contoller’s searchToSelectView.



    public weak var searchtoSelectViewDelegate: FUISearchToSelectViewDelegate?