IOS 封裝tableViewCell樣式不一致的UITableView脏款,告別復(fù)雜的DataSource和Delegate

Github鏈接

解決痛點(diǎn):

類似登錄注冊(cè)界面的TableView赠幕、上面的商品詳情的TableView殖妇、設(shè)置界面的TableView等。
他們的每條Cell的樣式都不一致改橘,且都可能hidden滋尉。如果用傳統(tǒng)的方式處理,會(huì)在UITableViewDataSource里寫一堆 if else判斷本Cell是否應(yīng)該顯示飞主,以讓Cell找到對(duì)應(yīng)的indexPath

本庫(kù)效果圖(其實(shí)效果圖不重要兼砖,重要的是代碼邏輯):

點(diǎn)擊按鈕可以獲取TextField里的值.gif
Cell的高度可以很方便的控制.gif

本庫(kù)使用流程:

先寫Cell對(duì)應(yīng)的Model:

//這個(gè)TableKitTextFieldCell對(duì)應(yīng)的Model,只能用class既棺,不要用struct讽挟;因?yàn)閟truct會(huì)在TableKitRow里產(chǎn)生一個(gè)無用的深copy
class TableKitTextFieldModel {
       
    var title: String? //左邊的Label內(nèi)容文字
    var value: String? //TextField的輸入內(nèi)容
    //TextField的屬性
    var secureTextEntry: Bool = false
    var placeHolder: String?
    var keyboardType: UIKeyboardType = UIKeyboardType.default
    var textAlignment: NSTextAlignment = NSTextAlignment.right
}


再寫Cell的代碼


//觸發(fā)cell內(nèi)部控件的事件的key;用來區(qū)分是哪個(gè)內(nèi)部事件
let TKTextFieldEditingChangedKey = "TKTextFieldEditingChangedKey"

//左label丸冕,右textField
class TableKitTextFieldCell: UITableViewCell, TableKitCellDataSource {
    
    //聲明該cell對(duì)應(yīng)的model數(shù)據(jù)類型耽梅;你可以不用寫這句,選擇直接把下文中的T換成Model胖烛;也能運(yùn)行但是那樣不規(guī)范
    typealias T = TableKitTextFieldModel
    
    //主model是在TableKitRow里強(qiáng)引用的眼姐,這里只是個(gè)副本
    private weak var weakModel: T!
    
    //當(dāng)用戶手動(dòng)觸發(fā)cell上的UI控件的各種事件
    //底層原理:把事件通過這個(gè)RowActionable回調(diào)給TableKitRow;然后TableKitRow收到回調(diào)后佩番,再回調(diào)給vc的TableRowAction
    private var customRowAction: RowActionable?
    
    //cell上的控件
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var textField: UITextField!
    
    //MARK: TableKitCellDataSource - 默認(rèn)高度
    //這里的默認(rèn)高度是第2優(yōu)先級(jí)众旗,如果在ViewController里設(shè)置本Cell高度屬于第1優(yōu)先級(jí)
    static var defaultHeight: CGFloat? {
        //返回0表示Cell高度為0,不寫該方法表示Cell高度為automaticDimension
        return 54
    }
    
    //MARK: TableKitCellDataSource - 綁定model 和 臨時(shí)存儲(chǔ)customRowAction
    //這個(gè)回調(diào)方法是由系統(tǒng)的cellForRowAtIndexPath觸發(fā)的趟畏,所以要寫的內(nèi)容就跟cellForRowAtIndexPath一樣
    func configureData(with tkModel: T ,customRowAction : RowActionable) {
        
        self.weakModel = tkModel
        self.customRowAction = customRowAction
        
        titleLabel.text = tkModel.title
        textField.text = tkModel.value
        textField.placeholder = tkModel.placeHolder
        textField.isSecureTextEntry = tkModel.secureTextEntry
        textField.textAlignment = tkModel.textAlignment
        textField.keyboardType = tkModel.keyboardType
        
        textField.addTarget(self, action: #selector(editingChanged(_:)), for: .editingChanged)
    }
    
    //cell內(nèi)部控件觸發(fā)的事件贡歧,通過本cell的全局變量customRowAction傳給TableKitRow,TableKitRow會(huì)再傳回給vc
    @objc fileprivate func editingChanged(_ textField:UITextField) {
        // 控件輸入監(jiān)聽赋秀,監(jiān)聽cell上的UI控件的output值的改變利朵,然后把新值設(shè)置回weakModel
        weakModel.value = textField.text;
        customRowAction?.onCustomerAction(customActionKey: TKTextFieldEditingChangedKey, cell: self, path: nil, userInfo: nil)
    }

}


最后是ViewController:

//添加"昵稱" UITableViewCell
    override func viewDidLoad() {
        let nameTkModel = TableKitTextFieldModel()
        nameTkModel.title = "昵稱"
        nameTkModel.placeHolder = "請(qǐng)輸入昵稱"
        
        //Cell點(diǎn)擊事件
        let cellClickAction = TableRowAction<TableKitTextFieldCell>(.click) { (options :TableRowActionCallback<TableKitTextFieldCell>) in
            options.cell?.textField.becomeFirstResponder()
        }
        
        //cell里的TextField的文本編輯事件
        let textFieldEditAction = TableRowAction<TableKitTextFieldCell>(.custom(TKTextFieldEditingChangedKey)) { (options :TableRowActionCallback<TableKitTextFieldCell>) in
            //options.dataModel 就是 nameTkModel
            print("vc收到昵稱輸入框變化1 = ",options.dataModel.value!)
        }
        
        let section = TableKitSection(headerTitle: "TextFieldCell的HeaderTitle", footerTitle: nil)
        self.nameTableKitRow = TableKitRow<TableKitTextFieldCell>(item: nameTkModel, actions: [cellClickAction, textFieldEditAction])
        section.append(row: self.nameTableKitRow)
        self.tableKitSections.append(section)
    }

安裝

先在終端里搜索 pod search QTableKit

如果搜索不到1.0版本,需要更新你電腦的pod倉(cāng)庫(kù)猎莲,以下是更新步驟:

  • pod repo update —verbose 更新你本地電腦的pod倉(cāng)庫(kù)绍弟。然后再搜索一次試試看
  • 如果還是搜索不到,執(zhí)行 rm ~/Library/Caches/CocoaPods/search_index.json 著洼。再搜索就OK了

導(dǎo)入方式

pod 'QTableKit'

Author:DQ

我的其他開源庫(kù)樟遣,給個(gè)Star鼓勵(lì)我寫更多好庫(kù):

IOS 1:1完美仿微信聊天表情鍵盤

IOS 自定義UIAlertController,支持彈出約束XibView身笤、彈出ViewController

IOS 封裝每條Cell樣式都不一致的UITableView豹悬,告別復(fù)雜的UITableViewDataSource

IOS 仿快手直播界面加載中,頂部的滾動(dòng)條狀LoadingView

IOS 基于個(gè)推+華為push的一整套完善的 IM聊天系統(tǒng)

Android 朋友圈列表Feed流的最優(yōu)化方案展鸡,讓你的RecyclerView從49幀 -> 57幀

Android 仿大眾點(diǎn)評(píng)屿衅、仿小紅書 下拉拖拽關(guān)閉Activity

Android 仿快手直播間手畫禮物,手繪禮物

Android 直播間聊天消息列表RecyclerView莹弊。一秒內(nèi)收到幾百條消息依然不卡頓

Android 仿快手直播界面加載中涤久,頂部的滾動(dòng)條狀LoadingView

Android Kotlin MVVM框架涡尘,全世界最優(yōu)化的分頁加載接口、最接地氣的封裝

Android 基于個(gè)推+華為push的一整套完善的android IM聊天系統(tǒng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末响迂,一起剝皮案震驚了整個(gè)濱河市考抄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔗彤,老刑警劉巖川梅,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異然遏,居然都是意外死亡贫途,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門待侵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丢早,“玉大人,你說我怎么就攤上這事秧倾≡乖停” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵那先,是天一觀的道長(zhǎng)农猬。 經(jīng)常有香客問我,道長(zhǎng)售淡,這世上最難降的妖魔是什么斤葱? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮勋又,結(jié)果婚禮上苦掘,老公的妹妹穿的比我還像新娘换帜。我一直安慰自己楔壤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布惯驼。 她就那樣靜靜地躺著蹲嚣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祟牲。 梳的紋絲不亂的頭發(fā)上隙畜,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音说贝,去河邊找鬼议惰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乡恕,可吹牛的內(nèi)容都是我干的言询。 我是一名探鬼主播俯萎,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼运杭!你這毒婦竟也來了夫啊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤辆憔,失蹤者是張志新(化名)和其女友劉穎撇眯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虱咧,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡熊榛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腕巡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片来候。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逸雹,靈堂內(nèi)的尸體忽然破棺而出营搅,到底是詐尸還是另有隱情,我是刑警寧澤梆砸,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布转质,位于F島的核電站,受9級(jí)特大地震影響帖世,放射性物質(zhì)發(fā)生泄漏休蟹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一日矫、第九天 我趴在偏房一處隱蔽的房頂上張望赂弓。 院中可真熱鬧,春花似錦哪轿、人聲如沸盈魁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杨耙。三九已至,卻和暖如春飘痛,著一層夾襖步出監(jiān)牢的瞬間珊膜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工宣脉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车柠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像竹祷,于是被迫代替她去往敵國(guó)和親介蛉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容