Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableViewCell具有多个子视图或单个视图_Ios_Objective C_Uitableview_Subview - Fatal编程技术网

Ios UITableViewCell具有多个子视图或单个视图

Ios UITableViewCell具有多个子视图或单个视图,ios,objective-c,uitableview,subview,Ios,Objective C,Uitableview,Subview,我是iOS编程新手,这就是为什么我在寻找最有效的解决方案。 我想要实现的是在UITableViewCell中显示一个名称(一些文本),在每个名称下显示一些填充的小矩形,里面有一个数字,类似于徽章 我的第一个想法是创建一个表示徽章的UIView,并在自定义UITableViewCell中添加这些矩形作为子视图。 第二个想法是只创建一个将绘制所有小矩形的UIView 我的问题是,了解以下情况后,哪种解决方案的性能更好: 单元格的数量最多为20个,矩形的总数不超过50个 单元格中显示的矩形数不同 我

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

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

我的问题是,了解以下情况后,哪种解决方案的性能更好:

  • 单元格的数量最多为20个,矩形的总数不超过50个
  • 单元格中显示的矩形数不同
  • 我想重用单元格,因此我必须更新/重画每行的单元格内容
  • 我希望避免“隐藏”子视图的单元选择视图问题
当然,我们欢迎任何其他解决方案

提前感谢,,
hxx

为什么不在
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(nsindepath*)indepath中创建单元格
这里可以定义自定义类型的单元格,该单元格也将重复使用,并且在需要时可以像这样向单元格中添加不同的内容

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;

只要你想,你可以添加你想要的东西与重用细胞。希望这对您有所帮助

您需要的是自定义单元格

这里有一个很好的教程


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

矩形可以是小型自定义按钮,带有背景图像(如果您有或为其提供背景色)和标题作为数字。但是,您必须根据表格的宽度计算其宽度,以容纳最大数量的矩形

您可以在xib中禁用表格的选择,也可以像so
cell.selectionStyle=UITableViewCellSelectionStyleNone那样通过编程方式进行选择和不实现
didSelectRowAtIndexPath

我已经采用了为我的表格划分单元格子类的方法来定制它们的外观和感觉,效果很好。我希望这能有所帮助

在这里可以找到一个很好的子类化入门教程


我想到了两种方法

  • 您可以将组件作为子视图放入
    UITableViewCell
    (通过XIB或编程子类化
    UITableViewCell
    )中,并在
    UITableView
    中使用它

  • 您可以将
    UITableViewCell
    子类化,覆盖
    -(void)drawRect
    方法,并绘制希望显示在单元格上的所有组件

  • 看看能不能帮上忙。 您可以创建一个扩展到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;
    
    }
    
    如果您添加到标签上的字符串不同,请制作标签。高度不同。您可以使用这样的代码

     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中动态重设行的高度

    谢谢你的快速回答。正如我所写的,单元格中矩形的数量是不同的,因此我不能用单个UILabel替换它们。按照您的解决方案,我需要根据单元格中矩形的数量添加动态标签(视图)。可以,但我担心它会消耗太多内存。您可以拥有多少矩形取决于您可以动态创建uilabels并在其上添加标记。因此,您说将矩形添加为子视图。但是内存消耗呢?我不需要在单元格中有UI对象,因为我只需要显示带有彩色背景的数字。为了在任何视图上显示任何类型的文本,您需要一个标签。此标签必须是给定视图的子视图。在表中的任何给定时间,内存中只有可见的单元格。这就是“dequeueReusableCellWithIdentifier“。如果需要显示文本,添加标签作为子视图是不可避免的。通常是的,我需要UILabel对象,但如果我将UIView子类化,在drawRect方法中,我可以使用NSString的drawAtPoint在其上绘制文本。所以我不需要所有的标签来显示单元格中的文本。但我的问题是,如果一个单元格被重用,它的drawRect方法会在每次给它赋值时调用,或者在创建单元格对象时只调用一次。哦,是吗!!,谢谢,我今天学到了一个新东西。我没有意识到这一点。很抱歉错误地认为创建标签是不可避免的。如果我理解正确,您需要在需要时调用drawRect,可能您可以尝试[self.view setNeedsDisplay],这将调用drawRect。是的,我知道,但问题是在自定义单元格中添加什么。绘制矩形的单个视图或每个矩形的单独视图?最好在容器UIView中有容器UIView和矩形的单独视图UIView是的,您的第二种方法与我想象的差不多,以便在视图上绘制矩形,但作为UITableViewCell子类的子视图。我不清楚的是,当单元格被重用时,如何强制单元格刷新自身并绘制相应的矩形。UITableViewCell有一个强制绘制的方法(setNeedsLayout方法)