我有一个与对象相关联的UITableViewCell
,我需要知道这个单元格是否可见。从我所做的研究来看,这意味着我需要以某种方式访问包含它的UITableView
(从那里,有几种方法可以检查它是否可见)。因此,我想知道UITableViewCell
是否有指向UITableView
的指针,或者是否有其他方法从单元格中获取指针?
我有一个与对象相关联的UITableViewCell
,我需要知道这个单元格是否可见。从我所做的研究来看,这意味着我需要以某种方式访问包含它的UITableView
(从那里,有几种方法可以检查它是否可见)。因此,我想知道UITableViewCell
是否有指向UITableView
的指针,或者是否有其他方法从单元格中获取指针?
- (id)recursivelyFindSuperViewWithClass:(Class)clazz fromView:(id)containedView {
id containingView = [containedView superview];
while (containingView && ![containingView isKindOfClass:[clazz class]]) {
containingView = [containingView superview];
}
return containingView;
}
传递类提供了在某些情况下遍历和获取除UITableView之外的其他视图的灵活性。
我对这个问题的解决方案与其他解决方案有些相似,但使用了优雅的for循环,而且代码简短。它也应该是面向未来的:
- (UITableView *)tableView
{
UIView *view;
for (view = self.superview; ![view isKindOfClass:UITableView.class]; view = view.superview);
return (UITableView *)view;
}
for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview);
- Antonio Nunes我基于Gabe的建议,认为在iOS7 beta5中UITableViewWrapperView
对象是UITableViewCell
对象的父视图。
继承UITableviewCell
:
- (UITableView *)superTableView
{
return (UITableView *)[self findTableView:self];
}
- (UIView *)findTableView:(UIView *)view
{
if (view.superview && [view.superview isKindOfClass:[UITableView class]]) {
return view.superview;
}
return [self findTableView:view.superview];
}
尝试使用["UItableViewvariable" visibleCells],而不是superview。
我在foreach循环中使用它来遍历应用程序看到的单元格,它起作用了。
for (UITableView *v in [orderItemTableView visibleCells])//visibleCell is the fix.
{
@try{
[orderItemTableView reloadData];
if ([v isKindOfClass:[UIView class]]) {
ReviewOrderTableViewCell *cell = (ReviewOrderTableViewCell *)v;
if (([[cell deleteRecord] intValue] == 1) || ([[[cell editQuantityText] text] intValue] == 0))
//code here
}
}
}
非常好用。
虽然经过最小化测试,但这个非泛型的Swift 3示例似乎可以工作:
extension UITableViewCell {
func tableView() -> UITableView? {
var currentView: UIView = self
while let superView = currentView.superview {
if superView is UITableView {
return (superView as! UITableView)
}
currentView = superView
}
return nil
}
}
extension UIView {
func parentTableView() -> UITableView? {
var viewOrNil: UIView? = self
while let view = viewOrNil {
if let tableView = view as? UITableView {
return tableView
}
viewOrNil = view.superview
}
return nil
}
}
你只需一行代码就能获得它。
UITableView *tableView = (UITableView *)[[cell superview] superview];
- (UITableView *) findParentTableView:(UITableViewCell *) cell
{
UIView *view = cell;
while ( view && ![view isKindOfClass:[UITableView class]] )
{
#ifdef DEBUG
NSLog( @"%@", [[view class ] description] );
#endif
view = [view superview];
}
return ( (UITableView *) view );
}
UITableViewCell Internal View Hierarchy Change in iOS 7
Using iOS 6.1 SDK
<UITableViewCell>
| <UITableViewCellContentView>
| | <UILabel>
Using iOS 7 SDK
<UITableViewCell>
| <UITableViewCellScrollView>
| | <UIButton>
| | | <UIImageView>
| | <UITableViewCellContentView>
| | | <UILabel>
The new private UITableViewCellScrollView class is a subclass of UIScrollView and is what allows this interaction:
![enter image description here][1]
[1]: http://i.stack.imgur.com/C2uJa.gif
这段代码 `UITableView *tblView=[cell superview];
将会给你一个包含表格视图单元格的UItableview实例。
[cell superView]
可能是什么? - Chris Loonam