MenuListKit 0.0.1

MenuListKit 0.0.1

测试已测试
语言语言 SwiftSwift
许可证 Apache 2
发布最新发布2017年10月
SwiftSwift 版本4.0
SPM支持 SPM

Andrea Antonioni 维护。



  • mooncoders

MenuListKit 提供了一种快速方式,在 Swift 中使用声明式编程来创建列表和菜单。它是在功能强大的 IGListKit 之上的一个薄抽象层。

特性
🚀 声明式定义列表和菜单
🙏🏻 代码反映 UI
📁 更少的代码和文件要管理
⚡️ 无性能影响
🔋 通过 IGListKitListDiffable 提高单元格更新效率

MenuListKit 的想法是提供一个声明式的方式,在 iOS 中创建菜单而不必编写样板代码。使用 MenuListKit,您将花费更少的时间思考如何加载数据不同的单元格,更新它们而不影响性能。现在您可以专注于您应用程序的架构和业务逻辑了 👍🏻。

以下示例中有一个经典的简单 待办事项列表 应用;如你所见,模型的数组反映了 UICollectionView 中的单元格。这将使您的代码更明确、易于阅读。

要求

  • iOS 9.0+
  • Swift 4.0+
  • Xcode 9.0+

使用方法

定义您的 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 文件。