SuggestionRow 3.3.0

SuggestionRow 3.3.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2022年7月
SPM支持 SPM

Hélène MartinMathias Claassen 支持。



Platform iOS

CocoaPods compatible License: MIT

内容

简介

SuggestionRowEureka iOS 表单构建器的行扩展,提供用户输入时的完成建议。可以实例化以下两种行

  • SuggestionAccessoryRow<T> - 以标签形式在水平显示为键盘上方的 collectionView 后提供完成建议。
  • SuggestionTableRow<T> - 在单元格下方提供一个表格,其中包含完成建议。

这两个类都是泛型,可以用于为符合 SuggestionValue 协议的任何类型提供完成建议

public protocol SuggestionValue: Equatable, InputTypeInitiable {
    var suggestionString: String { get }
}

SuggestionRow 基于 GooglePlacesRow 构建

安装

CocoaPods

CocoaPods 是 Cocoa 项目的一个依赖管理器。

SuggestionRow 添加到您的项目中的 Podfile 文件。

pod 'SuggestionRow'

然后运行 pod install

Swift Package Manager

Swift Package Manager 是一个用于管理 Swift 代码分发的工具。

在设置好您的 Package.swift 清单文件后,您可以通过将它添加到 Package.swift 的依赖项值中来将 SuggestionRow 作为依赖项添加。

dependencies: [ .package(url: "https://github.com/EurekaCommunity/SuggestionRow.git", from: "3.3.0") ]

使用方法

遵守 SuggestionValue 协议

首先,您想要提供补全建议的类型必须遵守 SuggestionValue 协议。例如,考虑以下 Scientist struct

struct Scientist {
    var id: Int
    var firstName: String
    var lastName: String

    init(id: Int, firstName: String, lastName: String) {
        self.id = id
        self.firstName = firstName
        self.lastName = lastName
    }
}

要遵守 SuggestionValue 协议,添加一个 suggestionString 方法,指定如何将 Scientist 显示为建议。这是将进入 inputAccessoryView 中的标签或在建议 UITableView 中的行中的文本。对于 Scientist,显示完整的名称是一个不错的选择,如下所示。 Scientist 还必须遵守 EquatableInputTypeInitiable,这是 SuggestionValue 所要求的。 InputTypeInitiable 是由 Eureka 定义的协议,它要求有一个可选的初始化器,它接受一个 String。它用于确定如何从 UITextField 的内容中实例化值。在这种情况下,用户的输入文本用于过滤现有值但不会创建新值,因此初始化器可以返回 nil。

extension Scientist: SuggestionValue {
    // Required by `InputTypeInitiable`, can always return nil in the SuggestionValue context.
    init?(string stringValue: String) {
        return nil
    }

    // Text that is displayed as a completion suggestion.
    var suggestionString: String {
        return "\(firstName) \(lastName)"
    }
}

为了遵守Equatable 协议,在全局范围内实现 ==运算符

func == (lhs: Scientist, rhs: Scientist) -> Bool {
    return lhs.id == rhs.id
}

实例化行

在您的表单中添加一行,类型为 SuggestionAccessoryRow<Scientist>SuggestionTableRow<Scientist>。您必须定义行的 filterFunction 以确定完成建议的来源以及如何根据用户输入进行选择。您设置为 filterFunction 的函数必须接受一个 String 参数(用户输入的内容)并返回一个 Scientist(有效建议)的数组。这个函数在用户输入字段每次更改时都会被调用。以下例子也位于 SuggestionExampleViewController

let users: [Scientist] = [Scientist(id: 1, firstName: "Albert", lastName: "Einstein"),
                          Scientist(id: 2, firstName: "Isaac", lastName: "Newton")]
...
form +++ Section("Table suggestions")
    <<< SuggestionTableRow<Scientist>() {
        $0.filterFunction = { [unowned self] text in
            self.users.filter({ $0.firstName.lowercased().contains(text.lowercased()) })
        }
        $0.placeholder = "Search for a famous scientist"
    }

运行示例

要运行示例,请按照以下步骤操作

  • 克隆或下载此存储库
  • 在根目录中运行 carthage update
  • 运行项目

自定义

SuggestionTableRow

SuggestionTableRow 使用一个通用的 SuggestionTableCell 单元格,其泛型参数是用于在 UITableView 中显示建议选项的 UITableViewCell 类。

  • 如果您想对建议表格行单元格进行微小的视觉更改,请使用 customizeTableViewCell 回调。

  • 您可以为显示选项的 tableView 自定义属性。您应该在 cellSetup 中这样做,并注意每次 tableView 显示时都会重置其框架。

  • 如果您想要对单元格进行大幅更改,创建自己的行,使用自己的单元格类,该类遵守 EurekaSuggestionTableViewCell。例如

final class MySuggestionTableRow<T: SuggestionValue>: _SuggestionRow<MySuggestionTableCell<T, SuggestionTableViewCell<T>>>, RowType {
    required public init(tag: String?) {
        super.init(tag: tag)
    }
}

class MySuggestionTableCell<T, TableViewCell: UITableViewCell>: SuggestionTableCell<T, TableViewCell> where TableViewCell: EurekaSuggestionTableViewCell, TableViewCell.S == T {
    // ...
}

open class MySuggestionTableViewCell<T: SuggestionValue>: SuggestionTableViewCell<T> {
    // ...
}

这里 MySuggestionTableCell 是行的实际单元格,而 MySuggestionTableViewCell 是用于显示建议的单元格。

查看默认单元格的源代码以获取灵感。

建议附件行

建议附件行 使用一个通用的 建议收集单元格 单元格,其泛型参数是 UICollectionViewCell 类,用于 inputAccessoryView

  • 如果您想进行细微的视觉修改,请使用 customizeCollectionViewCell 回调。

  • 如果您想改变 collectionView 的布局,则可以在声明行时使用/修改/覆盖 cellSetup 方法中的 collectionViewLayout 属性。

  • 如果您想改变 collectionView 的某些内容(例如其高度、背景颜色),您也可以在 cellSetup 方法中做到这一点。

  • 如果您想极大地改变 inputAccessoryView 的集合视图单元格,创建一个包含你自己的单元格类的自定义行(MySuggestionAccessoryRow),该类符合 EurekaSuggestionCollectionViewCell。这与上面提到的 SuggestionTableRow 示例非常相似。

依赖项

  • Eureka

要求

  • iOS 9.3+
  • Xcode 11+
  • Swift 5.0

参与进来

  • 如果您希望 做出贡献,请随时 提交拉取请求
  • 如果您 有功能请求,请 打开问题
  • 如果您 发现了错误需要帮助,请在提交问题之前请 查看旧问题