swift3 用协议实现从XIB加载view

版权声明:https://github.com/targetcloud 谢谢你的star https://blog.csdn.net/callzjy/article/details/65967872

如我们实现了一个类TGEmoticonInputV,这个类是UIView,同时对应的XIB(同名)也已经创建

以前我们要加载这个View的做法是

let v = Bundle.main.loadNibNamed("TGEmoticonInputV", owner: nil, options: nil)?.first as! TGEmoticonInputV

或者是

let nib = UINib(nibName: "TGEmoticonInputV", bundle: nil)
        let v = nib.instantiate(withOwner: nil, options: nil)[0] as! TGEmoticonInputV


一般一个项目可能多达几十个XIB甚至上百个,那么这样的重复代码是否可以精简一下呢?答案是肯定的

首先把这个重复的动作抽到一个协议中去,并在协议的extension中提供默认实现

代码如下

//
//  Nibloadable.swift
//
//  Created by targetcloud on 2017/3/25.
//  Copyright © 2017年 targetcloud. All rights reserved.
//

import Foundation

protocol Nibloadable {
    
}

extension Nibloadable where Self : UIView{
    /*
    static func loadNib(_ nibNmae :String = "") -> Self{
        let nib = nibNmae == "" ? "\(self)" : nibNmae
        return Bundle.main.loadNibNamed(nib, owner: nil, options: nil)?.first as! Self
    }
    */
    static func loadNib(_ nibNmae :String? = nil) -> Self{
        return Bundle.main.loadNibNamed(nibNmae ?? "\(self)", owner: nil, options: nil)?.first as! Self
    }
}

那么我们使用XIB形式创建View的时候,就可以非常简单了

let v = TGEmoticonInputV.loadNib()

从此再也不需要写一大串长的代码了,这就是协议的好处


注意,在类继承处由原来的

class TGEmoticonInputV: UIView {

改为如下

class TGEmoticonInputV: UIView,Nibloadable {

这样才能方便使用

let v = TGEmoticonInputV.loadNib()



展开阅读全文

没有更多推荐了,返回首页