可展开选择器
优势
- 选择列表中的任何项目。
- 当选择某些内容时,将通知代理。
- 根据
parentId
展开/收缩。 - 排序将为您自动进行(按字母顺序升序)。
- 可以以模态/推入的形式显示。
- 可以自定义尖括号按钮的颜色。
- 可以选择三种内置的样式选项
- 行
- 箭头(根级无缩进图像)
- 无(无缩进图像)
- 自定义(传递您自己的图像)
- 自定义缩进类型可以有一个可选的 '展开图像',并且会有动画效果。
- 可以自定义每个级别的缩进图像的颜色。
- 支持暗黑模式和亮色模式。
- 支持横屏和竖屏。
- 条形码/二维码扫描!
示例
运动- |
---|
![]() |
行缩进类型 | 箭头缩进类型 | 无缩进类型 | 自定义缩进类型 | 搜索 |
---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
要运行示例项目,请先克隆仓库,然后从 Example 目录中运行 pod install
需求
- iOS > 12.0
安装
可通过 CocoaPods 获取 ExpandablePicker。要安装它,只需将以下行添加到 Podfile 中
pod 'ExpandablePicker'
用法
import UIKit
import ExpandablePicker
struct Project {
let id: String
let title: String
let parentId: String?
}
class ViewController: UIViewController {
var myPretendData = [Project]()
override func viewDidLoad() {
super.viewDidLoad()
// my pretend api call
// populate my data
let deathStar = Project(id: "1", title: "Death Star", parentId: nil)
let detentionBlock = Project(id: "10", title: "Detention Block", parentId: "1")
let cellaa23 = Project(id: "100", title: "Cell AA-23", parentId: "10")
let emperorsThroneRoom = Project(id: "11", title: "Emperor's Throne Room", parentId: "1")
let tractorBeamControl = Project(id: "12", title: "Tractor Beam Control", parentId: "1")
let hangar272 = Project(id: "13", title: "Hangar 272", parentId: "1")
// if you want barcode / qr code scanning, add `scanMatchable:` paramter. (any string you pass in that array will match barcode/qrcode)
// does not matter what order items are placed
myPretendData.append(contentsOf: [hangar272, cellaa23, detentionBlock, tractorBeamControl, deathStar, emperorsThroneRoom])
}
@IBAction func lineVersionPressed(_ sender: Any) {
// convert data to picker data
let pickerData = myPretendData.map { (project) -> PickerData in
PickerData(id: project.id, title: project.title, parentId: project.parentId)
}
let vc = PickerViewController()
vc.set(title: "My Storm Trooper", subtitle: "Death to all rebels")
vc.datasource.data = pickerData
vc.delegate = self
let nc = UINavigationController(rootViewController: vc)
present(nc, animated: true, completion: nil)
}
}
extension ViewController: PickerProtocol {
func didSelectPickerData(with id: String, pvc: PickerViewController) {
guard let d = myPretendData.filter({ $0.id == id }).first else { return }
pvc.dismiss(animated: true) { [weak self] in
guard let s = self else { return }
let alert = UIAlertController(title: "Selected", message: "\(d.title) was selected.", preferredStyle: .alert)
s.present(alert, animated: true, completion: nil)
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
alert.dismiss(animated: true, completion: nil)
}
}
}
}
作者
Fishbowl Inventory (KraigWastlund)
许可
ExpandablePicker 遵循 MIT 许可证。有关更多信息,请参阅 LICENSE 文件。