上篇文章寫道怎么在tableviewcontroller里面添加一個view 用的是
[[[[UIApplication sharedApplication]? windows] firstObject] addSubview:_payView];
這樣將一個view添加到UIApplication的firstObject,對于后續維護不方便,而且這樣添加的view到其他界面還要隱藏起來,是一種“不健康的方式”。
對于訂單確認這種界面,內容可能會有增刪,不應該去使用tableviewcontroller,其根view是一個UITableview,導致很多很多問題,比如直接用addsubview添加一個view會隨著tableview的滾動而滾動,最好的方法就是讓根view是一個UIView。
下面簡單的介紹一下,怎么在viewcontroller拉取一個Dynamic Prototypes的tableview,代碼實現多個section,如圖1
首先,在一個viewcontroller里面拉取一個tableview,并添加多個cell,cell的樣式相當于要存在section的一樣,每一個cell起一個單獨的reuse identifier,再每個cell單獨建一個UITableviewCell文件,相同的cell就不用寫兩個,如圖一中的微信支付和支付寶支付只需要一個cell,到時候對該cell進行重用。如圖2
界面弄了之后,下面就是代碼碼阿碼阿阿碼阿碼阿碼
先是確定有幾個section,在確定section里面的row有多少個
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView { ?return6; }
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {
switch(section) {
case0: return1;? break;
case1: return1; break;
case2: return2; break;
case3: return1; break;
case4: return1; break;
case5: return1; break;
default: return0; break;?
} }
確定了數量之后,往每個section里面填入相應的cell,即引入上面創建的UITableviewCell文件,創建新的cell用上面寫好的cell reuse identifier確定
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
switch(indexPath.section) {
case0:
{
AddrInOrderConfirmTableViewCell* addrCell = [tableView dequeueReusableCellWithIdentifier:@"CellForAddr"];
//AddrInOrderConfirmTableViewCell是UITableviewCell文件,填寫在cell的custom class
//CellForAddr是cell的reuse identifier
return addrCell;
break;
}
...
//對相同的cell的重用如下,再PayTypeInOrderConfirmTableViewCell里面拉相應的label,進行值的變化
case2:
{
PayTypeInOrderConfirmTableViewCell* payTypeCell = [tableViewdequeueReusableCellWithIdentifier:@"CellForPayType"];
if(indexPath.row==0) {
payTypeCell.payTypeImg.image= [UIImageimageNamed:@"zhifubao"];
payTypeCell.payTypeLabel.text=@"支付寶支付";
}elseif(indexPath.row==1){
payTypeCell.payTypeImg.image= [UIImageimageNamed:@"wechat"];
payTypeCell.payTypeLabel.text=@"微信支付";
}returnpayTypeCell;
break;
}
最后對每個section取個title,再調整它的header和footer的高度就好了
- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section{
NSString* sectionName;
switch(section){
case0: sectionName =@"配送地址"; break;
...
}
return sectionName;
}
- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section {
switch(section) {
case0: return50;? break;
...
}}
-(CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
//section里面每個row的高度
- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{
switch(indexPath.section) {
case0: return60;? break;
...
}}
其實整個就是創建cell,讓section帶入每個cell,用reuse identifier來區別。
對于tableviewcontroller還是少用為好,畢竟用viewcontroller里面放個tableview也幾乎能完成全部功能,就是編寫時比較麻煩,但是易于維護。
萌新一起學習。