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 中搜索超级视图