Swift_纯代码实现分组TableView

效果图

Swift_纯代码实现分组TableView_第1张图片
Paste_Image.png

大体说一下思路,此页面是由顶部的HeadView以及一个TableView两部分构成,TableView有一个headView,分别是我的订单,优惠劵以及我的消息,通过闭包的回调完成点击的事件

1. 顶部的HeadView - UIImageView
步骤:
1. 定义相关控件
2. 在init(frame: CGRect)方法中设置相关属性并添加
3. 在layoutSubviews()方法中设置各个控件的frame

注意:如果你需要添加其它的参数(如: 点击方法),需要使用便利构造器,在第1步的时候,定义一个方法
     便利构造器是类的次要构造器, 你需要让便利构造器调用同一个类中的指定构造器, 并将这个指定构造器中的参数填上你想要的默认参数.

关于构造器可以参考我写的这篇Swift 类构造器的使用
代码

import UIKit

class MineHeadView: UIImageView {
   // 第1步:定义相关控件
    let setUpBtn: UIButton = UIButton(type: .Custom)
    let iconView: IconView = IconView()
   // 定义方法
    var buttonClick:(Void -> Void)?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        // 第2步:设置相关属性并添加
        image = UIImage(named: "v2_my_avatar_bg")
        setUpBtn.setImage(UIImage(named: "v2_my_settings_icon"), forState: .Normal)
        setUpBtn.addTarget(self, action: Selector("setUpButtonClick"), forControlEvents: .TouchUpInside)
        addSubview(setUpBtn)
        addSubview(iconView)
        self.userInteractionEnabled = true
    }
    // 便利构造器
   convenience init(frame: CGRect, settingButtonClick:(() -> Void)) {
   //  调用同一个类中的指定构造器
    self.init(frame: frame)
    buttonClick = settingButtonClick
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
 // 第3步:设置frame
  override func layoutSubviews() {
  super.layoutSubviews()
}
 
    func setUpButtonClick() {
        buttonClick?()
    }
2. TableView - headView

效果图

Paste_Image.png

TableView有一个headView,分别是我的订单,优惠劵以及我的消息,这是三个view,并在view上添加了一个button,我通过for...in循环分别给这三个view添加手势,实现点击事件,同时,定义了一个枚举并设置view的tag值,在点击事件中通过tap.view!.tag进行判断,实现相应的点击方法
代码

import UIKit

enum MineHeadViewButtonType: Int {
    case Order = 0
    case Coupon = 1
    case Message = 2
}

class MineTabeHeadView: UIView {
   // 第1步:定义相关控件和方法
    var mineHeadViewClick:((type: MineHeadViewButtonType) -> ())?

    override init(frame: CGRect) {
        super.init(frame: frame)
        
        backgroundColor = UIColor.whiteColor()
       // 第2步:设置相关属性并添加
        buildUI() 
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        // 第3步:设置frame
    }
    
    private func buildUI() {
        // 设置了view的tag值
        orderView.tag = 0
        addSubview(orderView)

        couponView.tag = 1
        addSubview(couponView)
        
        messageView.tag = 2
        addSubview(messageView)
        // 通过for...in循环分别给这三个view添加手势,实现点击事件
        for index in 0...2 {
            let tap = UITapGestureRecognizer(target: self, action: Selector("click:"))
            let subView = viewWithTag(index)
            subView?.addGestureRecognizer(tap)
        }
    }
    
    func click(tap: UIGestureRecognizer) {
        if mineHeadViewClick != nil {
        //  在点击方法中,通过tag值,实现相应的点击方法
            switch tap.view!.tag {
                
            case MineHeadViewButtonType.Order.rawValue:
                mineHeadViewClick!(type: MineHeadViewButtonType.Order)
                break
                
            case MineHeadViewButtonType.Coupon.rawValue:
                mineHeadViewClick!(type: MineHeadViewButtonType.Coupon)
                break
                
            case MineHeadViewButtonType.Message.rawValue:
                mineHeadViewClick!(type: MineHeadViewButtonType.Message)
                break
                
            default: break
            }
        }
    }
}

注意: view上button的图片和文字位置和button默认位置不一样,需要重写button的titleLabel和imageView两个属性,具体参考
UpImageDownTextButton这个类和相关代码

3. 自定义Cell
步骤:
1. 模型类 - 这里是从Plist中获取数据
2. 懒加载控件
3. 定义模型属性,并在didSet{}中进行赋值 - 相当于OC中的重写set方法
4. 在init(style: UITableViewCellStyle, reuseIdentifier: String?)方法中设置相关属性并添加
5. 在layoutSubviews()方法中设置各个控件的frame

注意:需要将控件添加到contentView上
    可以在cell中定义一个快速创建cell的方法
import UIKit

class MineCell: UITableViewCell {
     // 第3步:定义模型属性,并在didSet{}中进行赋值 
    var mineModel: MineCellModel? {
        didSet {
            titleLabel.text = mineModel!.title
            iconImageView.image = UIImage(named: mineModel!.iconName!)
        }
    }
    
    static private let identifier = "CellID"
    // 快速创建cell的方法
    class func cellFor(tableView: UITableView) -> MineCell {
        var cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? MineCell
        if cell == nil {
            cell = MineCell(style: .Default, reuseIdentifier: identifier)
        }
        return cell!
    }
    // 第2步:懒加载控件
    let bottomLine = UIView()
    private lazy var iconImageView = UIImageView()
    private lazy var titleLabel = UILabel()
    private lazy var arrowView = UIImageView()
    // 第4步:设置相关属性并添加
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
     // 第5步:设置frame
    override func layoutSubviews() {
        super.layoutSubviews()
    }
}

// 第1步:模型类 - 从Plist中获取数据
class MineCellModel: NSObject {
    var title: String?
    var iconName: String?
    
    class func loadMineCellModels() -> [MineCellModel]  {
        var mines = [MineCellModel]()
        let path = NSBundle.mainBundle().pathForResource("MinePlist", ofType: "plist")
        let arr = NSArray(contentsOfFile: path!)
        
        for dic in arr! {
            mines.append(MineCellModel.mineModel(dic as! NSDictionary))
        }
        return mines
    }
    // 相当于OC中的类方法/对象方法
    class func mineModel(dic: NSDictionary) -> MineCellModel {
        let model = MineCellModel()
        model.title = dic["title"] as? String
        model.iconName = dic["iconName"] as? String 
        return model
    }
}

代码链接地址

你可能感兴趣的:(Swift_纯代码实现分组TableView)