美文网首页
泛型的应用-UITableView的重用标识符

泛型的应用-UITableView的重用标识符

作者: yyyyy先生 | 来源:发表于2018-10-16 11:31 被阅读33次

    最近一直在整理知识点,将所学的东西记录下来,学以致用。接下来就说说Swift中的泛型的简单应用。

    话不多说,程序员就是要直接上代码:

    protocol Reuseable {
        static var reuseIdentifier: String { get }
        static var nib: UINib? { get }
    }
    
    extension Reuseable {
        static var reuseIdentifier: String {
            return String(describing: self)
        }
        static var nib: UINib? {
            return nil
        }
    }
    

    首先定义一个Reuseable协议,默认实现。

    // MARK: - tableview 的重用扩展
    extension UITableView {
        /// 注册cell方法
        ///
        /// - Parameter cell: cell类
        func register<T: UITableViewCell>(_ cell: T.Type) where T: Reuseable {
            if let nib = T.nib {
                register(nib, forCellReuseIdentifier: T.reuseIdentifier)
            } else {
                register(cell, forCellReuseIdentifier: T.reuseIdentifier)
            }
        }
        /// 注册头尾视图的方法
        ///
        /// - Parameter view: view类
        func registerHeaderFooterView<E: UITableViewHeaderFooterView>(_ view: E.Type) where E: Reuseable {
            if let nib = E.nib {
                register(nib, forHeaderFooterViewReuseIdentifier: E.reuseIdentifier)
            } else{
                register(view, forHeaderFooterViewReuseIdentifier: E.reuseIdentifier)
            }
        }
        /// 重用cell方法
        ///
        /// - Parameters:
        ///   - _: 类型名
        ///   - indexPath: indexPath
        /// - Returns: cell
        func dequeueCell<T: UITableViewCell>(indexPath: IndexPath) -> T where T: Reuseable {
            return self.dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as! T
        }
        /// 重用headerfooterview方法
        ///
        /// - Parameter view: 视图名称
        /// - Returns: 本身
        func dequequeHeaderFooterView<E: UITableViewHeaderFooterView>() -> E where E: Reuseable {
            return self.dequeueReusableHeaderFooterView(withIdentifier: E.reuseIdentifier) as! E
        }
    }
    

    我们在这里对UITableView添加几个自定义的注册以及重用方法。当然了,我们也不能忘了UICollectionView。

    // MARK: - collectionView 的重用扩展
    extension UICollectionView {
        /// 注册cell方法
        ///
        /// - Parameter cell: 类名
        func register<T: UICollectionViewCell>(_ cell: T.Type) where T: Reuseable {
            if let nib = T.nib {
                register(nib, forCellWithReuseIdentifier: T.reuseIdentifier)
            } else {
                register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier)
            }
        }
        /// 重用cell方法
        ///
        /// - Parameters:
        ///   - _: 类型名
        ///   - indexPath: indexPath
        /// - Returns: cell
        func dequeueCell<T: UICollectionViewCell>(indexPath: IndexPath) -> T where T: Reuseable {
            return self.dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T
        }
    }
    

    我们从UITableView的扩展方法中可以看出来,只要是遵循了Reuseable协议的UITableViewCell类型都可以重用。(UICollectionView同理)

    那么接下来我们就来创建一个UITableViewCell试试

    1、纯代码自定义cell,只需要遵循Reuseable即可。
    2、对于xib创建的cell,我们需要这样做

    extension CustomCell: Reuseable {
        static var nib: UINib? {
            return UINib(nibName: String(describing: self), bundle: nil)
        }
    }
    

    这样结合UITableVIew扩展中的方法,我们获得的identifier就是CustomCell,调用很方便:

    tableView.register(CustomCell.self)
    ...
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell: CustomCell = tableView.dequeueCell(indexPath: indexPath)
            return cell
        }
    

    这就是Swift中的泛型的简单应用,我们在开发过程中可以脑洞大开,多做一些尝试,利用泛型的特性去写代码,让代码变得简单快捷,而且会有很大的乐趣。

    相关文章

      网友评论

          本文标题:泛型的应用-UITableView的重用标识符

          本文链接:https://www.haomeiwen.com/subject/hywczftx.html