关于view的tag复用的问题,也许对于一些人来说,没有踩过这个坑,但是我踩过好几次。对于在一个view上创建几个子类,如果是动态创建的话,最好的方式就是用tag值进行复用。
比如:
UIButton*btn = (UIButton*)[self.scrollView viewWithTag:kBaseButtonTag+ index];
if(!btn){
btn = [[UIButton allc]initWithType:buttonType];
btn.tag=kBaseButtonTag+ index;
}
[btn setFrame:CGRectMake(kMarginHorizon+ index *kItemGap+ index * btnWidth,kMarginVertical, btnWidth,kItemHeight)];
[btn refreshViewWithGroupCategoryItem:groupCategoryItem withTitleBackGroundImage:nil];
[btn addTarget:selfaction:@selector(buttonClickedWithSender:)forControlEvents:UIControlEventTouchUpInside];
[self.scrollView addSubview:btn];
之前是这么写的,但是对于根据个数动态创建view来说,这个代码还不是完善的。当第二次的数据比第一次少的时候,会有多于的view展示,所以在每次来新的数据时,记得重置view的subviews。例如:
- (void)resetScrollViewWithTypeArray:(NSArray*)groupTypeArray
{
NSInteger subCount =self.scrollView.subviews.count;
NSInteger newCount = groupTypeArray.count;
if(newCount > subCount)
{
[self.scrollView.subviews enumerateObjectsUsingBlock:^(__kindof UIView*_Nonnull obj,NSUInteger idx,BOOL*_Nonnull stop) {
if([obj isKindOfClass:[UIButton class]])
{
obj.hidden=NO;
}
}];
}else if(newCount < subCount)
{
for(NSInteger index = newCount ; index < subCount; index ++)
{
UIButton*btn = (UIButton*)[self.scrollView viewWithTag:kBaseButtonTag+ index];
btn.hidden=YES;
}
}
}
网友评论