UITableViewCell 子视图在 iOS7 中只返回 UITableViewCellScrollView

Posted

技术标签:

【中文标题】UITableViewCell 子视图在 iOS7 中只返回 UITableViewCellScrollView【英文标题】:UITableViewCell subviews returns only UITableViewCellScrollView in iOS7 【发布时间】:2013-10-04 05:22:53 【问题描述】:

我有一个自定义的UITableViewCell,有 7 个子视图。其中一个是活动视图,所以为了找到它并停止,我做了这样的事情:

NSArray *subviews=[cell subviews];       
NSLog(@"Subviews count: %d",subviews.count);     
for (UIView *view in subviews)  
                
  NSLog(@"CLASS: %@",[view class]);     
  // code here     
 

iOS6 中,子视图数:7,其中之一是活动视图。 但是在 iOS7 中,Subviews count: is 1 并且 [view class] 返回 UITableViewCellScrollView 。 试过 NSArray *subviews=[cell.superview subviews];NSArray *subviews=[cell.contentview subviews]; ,但没有成功。

有什么建议吗?

【问题讨论】:

递归子视图很痛苦,您应该考虑子类化UITableViewCell 或使用viewWithTag: 来查找活动视图。 developer.apple.com/library/ios/documentation/uikit/reference/…: 【参考方案1】:

您需要递归地下降到每个子视图的子视图等。永远不要对私有子视图结构做任何假设。更好的是,由于您应该只将子视图添加到单元格的 contentView,因此只需查看 contentView,而不是整个单元格。

【讨论】:

除了答案,这里是例子:***.com/a/19412487/1721946 在查看了 Apple 的文档后,我同意 Brian Nickel 的观点,您应该使用 [contentView viewWithTag:tag] 而不是递归地遍历视图。搜索viewWithTag:here看解释【参考方案2】:

我认为您应该在代码中添加条件语句:

NSArray *subviews;
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    subviews = aCell.contentView.subviews;
else
    subviews = aCell.subviews;

for(id aView in subviews) 
    if([aView isKindOfClass:[aField class]]) 
        //your code here
    


//don't forget to add a conditional statement even on adding your subviews to cell
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
    [aCell.contentView addSubview:aField];
else
    [aCell addSubview:aField];

这是上述 SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO 宏的定义:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

【讨论】:

我认为这实际上没有必要,因为 contentView 从 iOS2 开始就存在:developer.apple.com/library/ios/documentation/uikit/reference/…【参考方案3】:

我在单元格上动态添加imageview,因此self.contentview.subviews 正在删除分隔线和附件视图。所以我做了类似

for (id obj in self.contentView.superview.subviews) 
    if ([obj isMemberOfClass:[UIImageView class]]) 
        [obj removeFromSuperview];
    

为我工作,希望对少数人有用!

【讨论】:

【参考方案4】:

以下是如何在自定义 UITableViewCell 中迭代控件

UITableViewCell *cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault       reuseIdentifier:@"anyname"];


   UIView *view=cell.contentView;

    for(id object in view.subviews)
    

        if([object isKindOfClass:[UILabel class]])
        
            NSLog(@"%@",[object class]);
            // UILabel *label=  (UILabel*)view;
            //[label setFont:TextFont];
        



    

您可以根据特定控件的类检查任何类型的控件。

【讨论】:

【参考方案5】:

因为我还没有看到这个问题的正确答案,所以即使这已经一岁了,我也会在这里发布。 (归功于已经发布过此内容的 Brian Nickel)。首先,您只能获得一个视图,因为单元格有一个 contentView,所有子节点都在其中(已经解释了很多)。 至于如何在 contentView 中找到您的视图,在 Apple https://developer.apple.com/library/ios/documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html 的这份文档中,您可以看到他们建议使用 viewWithTag: 来获取内容视图中的视图。因此,您需要在内容视图中标记每个视图,或者只标记您想要查找的视图,然后调用: [cell.contentView viewWithTag: tag] 希望对像我这样的谷歌用户有所帮助。

【讨论】:

以上是关于UITableViewCell 子视图在 iOS7 中只返回 UITableViewCellScrollView的主要内容,如果未能解决你的问题,请参考以下文章

iOS7:来自其子视图之一的 UITableViewCell

用作自定义 UITableViewCell 的 XIB 中的自定义按钮不响应点击(ios7)

添加 UITextField 作为 UITableViewCell 的子视图在 IOS 6 中工作正常,但在 IOS 7 中它不起作用?

在 UITableViewCell iOS7 中搜索超级视图

在iOS7中处于编辑模式时更改uitableviewcell“删除”部分的颜色

iOS7 iOS8 UITableviewCell处于编辑状态,dismiss或者back崩溃