iOS 點選UITableViewCell上的控制元件獲取對應的cell

Deft_MKJing宓珂璟發表於2017-07-21

場景

很多情況下cell上有很多可以觸發的子控制元件,例如點贊,提示,選擇等操作,介紹幾個方法,隨意感受下

方法1 (獲取SuperView)

@implementation UIView (GetCellFromContentviewSubview)
- (UITableViewCell *)getCellFromContentviewSubview
{
    if ([[[self superview] superview] isKindOfClass:[UITableViewCell class]]) {
        return (UITableViewCell *)[[self superview] superview];
    }
    else if ([[[[self superview] superview] superview] isKindOfClass:[UITableViewCell class]]) {
        return (UITableViewCell *)[[[self superview] superview] superview];
    }
    else{
         NSLog(@"Something Panic Happens");
    }
    return nil;
}
@end

方法2 (另一種方式獲取SuperView)

@interface UIView (SuperView)

- (UIView *)findSuperViewWithClass:(Class)superViewClass;

@end


@implementation UIView (SuperView)

- (UIView *)findSuperViewWithClass:(Class)superViewClass {

    UIView *superView = self.superview;
    UIView *foundSuperView = nil;

    while (nil != superView && nil == foundSuperView) {
        if ([superView isKindOfClass:superViewClass]) {
            foundSuperView = superView;
        } else {
            superView = superView.superview;
        }
    }
    return foundSuperView;
}
@end

// 呼叫
UITableViewCell *cell = [button findSuperViewWithClass:[UITableViewCell class]]

方法3 (牆裂推薦)

CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
UITableViewCell *cell = (UITableViewCell*)[self.tableView cellForRowAtIndexPath:indexPath];

這個方法看上去比上面兩個舒服多了吧,簡單理解下
第一段:指定的控制元件A,A區域裡面的有個座標(0,0)的位置,把該座標相對於A控制元件的位置轉換到相對於tableView的座標
第二段:indexPathForRowAtPoint 根據轉換的座標,獲取對應的indexpath
第三段:根據Indexpath獲取對應的cell

座標轉換convertPoint非常通俗的講解,可以加深理解—>傳送門

相關文章