解決痛點(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í)效果圖不重要兼砖,重要的是代碼邏輯):
本庫(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 自定義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 直播間聊天消息列表RecyclerView莹弊。一秒內(nèi)收到幾百條消息依然不卡頓
Android 仿快手直播界面加載中涤久,頂部的滾動(dòng)條狀LoadingView