Swift_純代碼實(shí)現(xiàn)分組TableView

效果圖

Paste_Image.png

大體說一下思路,此頁面是由頂部的HeadView以及一個(gè)TableView兩部分構(gòu)成,TableView有一個(gè)headView,分別是我的訂單,優(yōu)惠劵以及我的消息,通過閉包的回調(diào)完成點(diǎn)擊的事件

1. 頂部的HeadView - UIImageView
步驟:
1. 定義相關(guān)控件
2. 在init(frame: CGRect)方法中設(shè)置相關(guān)屬性并添加
3. 在layoutSubviews()方法中設(shè)置各個(gè)控件的frame

注意:如果你需要添加其它的參數(shù)(如: 點(diǎn)擊方法),需要使用便利構(gòu)造器,在第1步的時(shí)候,定義一個(gè)方法
     便利構(gòu)造器是類的次要構(gòu)造器, 你需要讓便利構(gòu)造器調(diào)用同一個(gè)類中的指定構(gòu)造器, 并將這個(gè)指定構(gòu)造器中的參數(shù)填上你想要的默認(rèn)參數(shù).

關(guān)于構(gòu)造器可以參考我寫的這篇簡(jiǎn)書Swift 類構(gòu)造器的使用
代碼

import UIKit

class MineHeadView: UIImageView {
   // 第1步:定義相關(guān)控件
    let setUpBtn: UIButton = UIButton(type: .Custom)
    let iconView: IconView = IconView()
   // 定義方法
    var buttonClick:(Void -> Void)?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        // 第2步:設(shè)置相關(guān)屬性并添加
        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
    }
    // 便利構(gòu)造器
   convenience init(frame: CGRect, settingButtonClick:(() -> Void)) {
   //  調(diào)用同一個(gè)類中的指定構(gòu)造器
    self.init(frame: frame)
    buttonClick = settingButtonClick
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
 // 第3步:設(shè)置frame
  override func layoutSubviews() {
  super.layoutSubviews()
}
 
    func setUpButtonClick() {
        buttonClick?()
    }
2. TableView - headView

效果圖

Paste_Image.png

TableView有一個(gè)headView,分別是我的訂單,優(yōu)惠劵以及我的消息,這是三個(gè)view,并在view上添加了一個(gè)button,我通過for...in循環(huán)分別給這三個(gè)view添加手勢(shì),實(shí)現(xiàn)點(diǎn)擊事件,同時(shí),定義了一個(gè)枚舉并設(shè)置view的tag值,在點(diǎn)擊事件中通過tap.view!.tag進(jìn)行判斷,實(shí)現(xiàn)相應(yīng)的點(diǎn)擊方法
代碼

import UIKit

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

class MineTabeHeadView: UIView {
   // 第1步:定義相關(guān)控件和方法
    var mineHeadViewClick:((type: MineHeadViewButtonType) -> ())?

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

        couponView.tag = 1
        addSubview(couponView)
        
        messageView.tag = 2
        addSubview(messageView)
        // 通過for...in循環(huán)分別給這三個(gè)view添加手勢(shì),實(shí)現(xiàn)點(diǎn)擊事件
        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 {
        //  在點(diǎn)擊方法中,通過tag值,實(shí)現(xiàn)相應(yīng)的點(diǎn)擊方法
            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默認(rèn)位置不一樣,需要重寫button的titleLabel和imageView兩個(gè)屬性,具體參考
UpImageDownTextButton這個(gè)類和相關(guān)代碼

3. 自定義Cell
步驟:
1. 模型類 - 這里是從Plist中獲取數(shù)據(jù)
2. 懶加載控件
3. 定義模型屬性,并在didSet{}中進(jìn)行賦值 - 相當(dāng)于OC中的重寫set方法
4. 在init(style: UITableViewCellStyle, reuseIdentifier: String?)方法中設(shè)置相關(guān)屬性并添加
5. 在layoutSubviews()方法中設(shè)置各個(gè)控件的frame

注意:需要將控件添加到contentView上
    可以在cell中定義一個(gè)快速創(chuàng)建cell的方法
import UIKit

class MineCell: UITableViewCell {
     // 第3步:定義模型屬性,并在didSet{}中進(jìn)行賦值 
    var mineModel: MineCellModel? {
        didSet {
            titleLabel.text = mineModel!.title
            iconImageView.image = UIImage(named: mineModel!.iconName!)
        }
    }
    
    static private let identifier = "CellID"
    // 快速創(chuàng)建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步:設(shè)置相關(guān)屬性并添加
    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步:設(shè)置frame
    override func layoutSubviews() {
        super.layoutSubviews()
    }
}

// 第1步:模型類 - 從Plist中獲取數(shù)據(jù)
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
    }
    // 相當(dāng)于OC中的類方法/對(duì)象方法
    class func mineModel(dic: NSDictionary) -> MineCellModel {
        let model = MineCellModel()
        model.title = dic["title"] as? String
        model.iconName = dic["iconName"] as? String 
        return model
    }
}

代碼鏈接地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS高仿愛鮮蜂 前言 2015年匆匆的就過去了,又老了一歲,這一年起起伏伏,有笑聲也有眼淚,感謝陪伴在我身邊的人...
    Top_熊閱讀 33,881評(píng)論 267 438
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,139評(píng)論 25 708
  • 2017.02.22 可以練習(xí),每當(dāng)這個(gè)時(shí)候,腦袋就犯困,我這腦袋真是神奇呀,一說讓你做事情,你就犯困,你可不要太...
    Carden閱讀 1,491評(píng)論 0 1
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,414評(píng)論 4 61
  • 簡(jiǎn)介:尼爾森(Jakob Nielsen)于1995年針對(duì)Web交互設(shè)計(jì)提出的可用性原則。網(wǎng)上翻譯版本很多,有作修...
    靈魂設(shè)計(jì)師閱讀 2,255評(píng)論 0 5

友情鏈接更多精彩內(nèi)容