上篇文章写道怎么在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也几乎能完成全部功能,就是编写时比较麻烦,但是易于维护。
萌新一起学习。