具有大量子视图或单个视图的UITableViewCell

时间:2013-06-20 06:56:00

标签: ios objective-c uitableview subview

我是iOS编程的新手,这就是为什么我正在为我的问题寻找最有效的解决方案。 我想要实现的是在UITableViewCell中显示一个名称(一些文本),并在每个名称下面填充一些内部带有数字的小矩形,类似于徽章。

我的第一个想法是创建一个代表徽章的UIView,并在自定义UITableViewCell中将这些矩形添加为subviews。 第二个想法是只创建一个将绘制所有小矩形的UIView

我的问题是,哪个是性能更好的解决方案,知道:

  • 单元格数量最多20和矩形的总数不超过50
  • 单元格中显示的矩形数量不同
  • 我想重复使用单元格,因此我必须更新/重绘每行的单元格内容
  • 我想避免“隐藏”子视图
  • 的单元格选择视图问题

当然,任何其他解决方案都表示赞赏。

提前致谢, hxx

5 个答案:

答案 0 :(得分:0)

为什么你不在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中创建单元格在这里你可以定义你的自定义类型单元格,它也可以重复使用,你可以随时添加不同的东西到这样的单元格。

static NSString *CellIdentifier = @"Cell";
UILabel *RequestSentTo;
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    RequestSentTo = [[UILabel alloc] initWithFrame:CGRectMake(11, 2, 286, 40)];
    RequestSentTo.backgroundColor = [UIColor clearColor];
    RequestSentTo.tag = 200;
    RequestSentTo.numberOfLines = 3;
    RequestSentTo.font=[UIFont boldSystemFontOfSize:15.0];
    RequestSentTo.textColor = [UIColor blackColor];
    RequestSentTo.lineBreakMode=UILineBreakModeWordWrap;
    [cell.contentView addSubview:RequestSentTo];
} else {
    RequestSentTo=(UILabel*)[cell.contentView viewWithTag:200];
}
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:@"Shift Request for "];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ by ",dateStr] attributes:nil]];
[string appendAttributedString:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"Dr. %@",notificationsObj.doctorName] attributes:purpleTextAttributes]];//purpl
RequestSentTo.attributedText=string;
RequestSentTo.lineBreakMode=UILineBreakModeWordWrap;
RequestSentTo.numberOfLines = 3;

无论何时,您都可以通过重复使用单元格添加所需的内容。希望这有帮助

答案 1 :(得分:0)

您需要什么称为自定义单元格

这是一个很好的教程

customize table view cells for uitableview

答案 2 :(得分:0)

我的建议是对UITableViewCell进行子类化并在其中进行自定义。自定义视图下方可以有标签和矩形。

矩形可以是带有背景图像的小型自定义按钮(如果你有任何或给它背景颜色)和标题作为你的数字。你必须根据你的桌子的宽度计算它们的宽度以适应最大矩形数。

您可以在xib中禁用对表格的选择,或者您可以通过编程方式执行此操作cell.selectionStyle = UITableViewCellSelectionStyleNone;并且不执行didSelectRowAtIndexPath

我已经按照为我的表子类化单元格的方法来定制他们的外观和感觉并且效果很好。我希望这会有所帮助。

可以在这里找到一个从子类化开始的好教程

http://howtomakeiphoneapps.com/how-to-design-a-custom-uitableviewcell-from-scratch/1292/

答案 3 :(得分:0)

我想到了两种方法。

  1. 您可以将组件作为子视图放在UITableViewCell内(通过XIB或以编程方式子类化UITableViewCell)并在UITableView中使用。

  2. 您可以继承UITableViewCell,并覆盖-(void)drawRect方法并绘制您希望在单元格上显示的所有组件。

答案 4 :(得分:0)

看看是否可以提供帮助。 您可以创建一个扩展到UITableViewCell的新类,这意味着将UITableViewCell重写为您自己的名为MyTestCell的单元格。 在此单元格中,您可以调用创建属性(如标签和视图),并将其添加到新单元格中。 比如把它添加到MyTestCell.h

@property (nonatomic, retain) UILable *myLable1;
@property (nonatomic, retain) UIView *mySubview1;

MyTestCell.m
_myLable1 = .....
_mySubview = .....

[self addSubview: _myLbale1];
[self addSubview: _mySubview1];


And when use, u can work like this

static NSString *CellIdentifier = @"MyCell";
MyTableViewCell *cell = [tableview dequeReuseID:CellIdentifier]; 
if (cell == nil) {
  cell = [MyTableViewCell alloc] init.........
} 

//And you can sign your property here in your cell
cell.myLable1 = ....
cell.myView1 = .....

return cell;

}

如果你的字符串添加到标签是不同的,请使lable.height不同。你可以使用像这样的代码

 CGSize labelSize = [str sizeWithFont:[UIFont boldSystemFontOfSize:17.0f]
                   constrainedToSize:CGSizeMake(280, 100)
                   lineBreakMode:UILineBreakModeCharacterWrap];   //check your lableSize
 UILabel *patternLabel = [[UILabel alloc] initWithFrame:CGRectMake(35, 157, labelSize.width, labelSize.height)];   
 patternLabel.text = str;
 patternLabel.backgroundColor = [UIColor clearColor];
 patternLabel.font = [UIFont boldSystemFontOfSize:17.0f];
 patternLabel.numberOfLines = 0;// must have
 patternLabel.lineBreakMode = UILineBreakModeCharacterWrap;// must have

将此添加到您的单元格,并使其动态调整您的标签以及您的单元格!而且你必须动态地为你的tableView行高设置高。(知道什么是动态调整大小?) 看到这个:      重写MyTableViewCell.m中的方法setMyLable1

 -(void)setMyLable1:(UILable*)aLable
 {
   //in here when never your sign your alabel to your cell (like this : cell.myLable1) this method will be call and u can get the size of your string and set this label's height
   //get string size  StringSzie

   [_myLable1 setFrame:CGRectMake(10,10,stringSize.width,stringSize.height)];

   //And resize your cell as well
   [self setFrame:CGRectMake(0,0,_myLable1.frame.size.width+20,_myLable1.frame.size.height+20)];

   //done!!!

 } 

好的,你可以为自己获得一个自动重新生成的单元格,你必须在tableView中为你的行动态重置高度!!!!!