测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | Apache 2 |
发布最新发布 | 2017年10月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由Andrea Antonioni 维护。
MenuListKit 提供了一种快速方式,在 Swift 中使用声明式编程来创建列表和菜单。它是在功能强大的 IGListKit 之上的一个薄抽象层。
特性 | |
---|---|
声明式定义列表和菜单 | |
🙏🏻 | 代码反映 UI |
更少的代码和文件要管理 | |
无性能影响 | |
通过 IGListKit 的 ListDiffable 提高单元格更新效率 |
MenuListKit 的想法是提供一个声明式的方式,在 iOS 中创建菜单而不必编写样板代码。使用 MenuListKit,您将花费更少的时间思考如何加载数据不同的单元格,更新它们而不影响性能。现在您可以专注于您应用程序的架构和业务逻辑了 👍🏻。
以下示例中有一个经典的简单 待办事项列表 应用;如你所见,模型的数组反映了 UICollectionView
中的单元格。这将使您的代码更明确、易于阅读。
MenuItem
首先,创建一个具有自定义 UI 的 UICollectionViewCell
。您可以通过编程方式创建单元格或从 xib 加载它。
class ToDoCell: UICollectionViewCell {
@IBOutlet private weak var statusLabel: UILabel!
@IBOutlet private weak var textLabel: UILabel!
var text: String? {
get { return textLabel.text }
set { textLabel.text = newValue }
}
var isCompleted: Bool = false {
didSet {
statusLabel.text = isCompleted ? "✅" : "⏺"
}
}
override func awakeFromNib() {
super.awakeFromNib()
isCompleted = false
}
}
在 MenuListKit 中,每个单元格都由一个 MenuItem
对象表示。MenuItem
类是您的单元格的“模型表示”。它包含配置 UICollectionViewCell
视图所需的所有信息。
创建从 MenuItem
继承的项类,并实现 ListDiffable
(来自 IGListKit)。
记得在顶部写上
import IGListKit
import MenuListKit
import IGListKit
class ToDoItem: MenuItem<ToDoCell>, ListDiffable {
let uuid = UUID().uuidString
var text: String
var isCompleted: Bool
init(text: String, isCompleted: Bool) {
self.text = text
self.isCompleted = isCompleted
super.init(bundle: Bundle.main,
height: 55,
actionDelegate: nil)
}
override func bind(to cell: ToDoCell) {
cell.text = text
cell.isCompleted = isCompleted
}
// MARK: - ListDiffable
func diffIdentifier() -> NSObjectProtocol {
return uuid as NSObjectProtocol
}
func isEqual(toDiffableObject object: ListDiffable?) -> Bool {
if let object = object as? ToDoItem {
return object.text == text && object.isCompleted == isCompleted
}
return false
}
}
MenuAdapterItem
和数据源为了将模型数组加载到 UICollectionView
中,我们重用了 IGListKit 的想法,并创建了 MenuListAdapter
。
为了完成这项工作,实现数据源协议 MenuListAdapterDataSource
以向 collectionView 提供模型数组。适配器将基于该数组管理所有插入、删除和更新。
您还可以提供一个 UIView
用于显示没有数据时的情况。
import MenuListKit
import IGListKit
class ToDoViewController: UIViewController {
let collectionView = UICollectionView(frame: .zero,
collectionViewLayout: UICollectionViewFlowLayout())
lazy var adapter: MenuListAdapter = {
return MenuListAdapter(viewController: self)
}()
let todos = [
ToDoItem(text: "Clean up my room", isCompleted: false),
ToDoItem(text: "Buy 3 apples", isCompleted: true),
ToDoItem(text: "Plan my next trip", isCompleted: true),
ToDoItem(text: "Book a hotel room in Rome", isCompleted: false)
]
override func viewDidLoad() {
super.viewDidLoad()
collectionView.backgroundColor = .white
view.addSubview(collectionView)
adapter.collectionView = collectionView
adapter.dataSource = self
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
collectionView.frame = view.bounds
}
}
// MARK: - MenuListAdapterDataSource
extension ToDoViewController: MenuListAdapterDataSource {
func objects(for menuListAdapter: MenuListAdapter) -> [ListDiffable & BaseMenuItem] {
return todos
}
func emptyView(for menuListAdapter: MenuListAdapter) -> UIView? {
return nil
}
}
我们是三个热爱开源项目的朋友
与我们取得联系,问候一下 👋🏻,请发送邮件至 [email protected]。我们也在 Medium 上。
欢迎提出想法、问题或拉取请求进行合作。
顺便说一句。如果您在应用程序中使用 MenuListKit,我们非常想了解关于它的信息!
MenuListKit 项目遵循 Apache 2.0 许可协议。有关更多信息,请参阅 LICENSE 文件。