2014-11-06 4 views
0

셀이있는 테이블이 있습니다. 각 셀에는 전화 번호 레이블이 있습니다. 라벨을 탭하면 UIMenuController이 나타납니다.레이블로 셀의 인덱스 경로를 찾으십시오.

선택한 레이블을 포함하는 셀의 indexPath를 찾는 주요 방법은 무엇입니까? (didSelectRowAtIndexPath:을 호출하면 안됨)

많은 더러운 해킹을 상상할 수 있지만, 주된/좋은 해결책을 찾고 있습니다.

UPD는

내가 선택한 라벨을 참조있다.

+0

안녕하세요, 왜 didSelectRowAtIndexPath를 호출하면 안됩니까? – james075

+0

주먹으로, 나는이 메서드에서 두 번째로 레이블을 터치 할 때 행을 선택하지 않을 것입니다. 매개 변수로 제공된 indexPath 만 저장할 수 있습니다. @ James03 –

답변

4

편집 :

이것은 더 나은 방법입니다.

- (IBAction)someMethod:(id)sender { 
    CGPoint hitPoint = [sender convertPoint:CGPointZero toView:self.tableView]; 
    NSIndexPath *hitIndex = [self.tableView indexPathForRowAtPoint:hitPoint]; 
} 
+0

아주 쉽습니다! 말해줘, 왜 슈퍼 뷰가 두 번 전화 했어? –

+0

contentView가 iOS 7에 존재합니다. tableViewCells –

+0

발신자가 포함되어 있고 완료된 IBAction 메소드에서 편집 된 답변을 수행하십시오. 훨씬 더 청결한. –

-1

당신은 갈 수 :

NSMutableArray *cells = [[NSMutableArray alloc] init]; 
for (NSInteger j = 0; j < [tableView numberOfSections]; ++j) 
{ 
    for (NSInteger i = 0; i < [tableView numberOfRowsInSection:j]; ++i) 
    { 
     [cells addObject:[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]]; 
    } 
} 

for (UITableViewCell *cell in cells){ 
    for (UILabel *label in cell.subviews){ 
     if (label == yourLabel) 
      indexPath = [tableView indexPathForCell: cell]; 
    } 
} 
+0

나는이 알고리즘을 안다. 그러나 나는 테이블 전체를 스캔해야하고, 나를 놀라게한다. (O (n) 때문에). –

+1

UITableView 메서드 indexPathsForVisibleRows를 사용하여 O (n) 문제를 피할 수 있으며 그 목록을 확인하지만 DCGoD의 대답에 설명 된대로 UITableView 메서드 indexPathForRowAtPoint :를 사용하면 훨씬 간단하고 간단합니다. –

1

를 레이블에서 레이블의 계층 구조에서 셀 객체를 검색 : 당신이 셀이 있으면

-(UITableViewCell*) cellContainingView:(UIView*)view 
{ 
    UIView* currentView = view; 
    while (currentView) 
    { 
     if ([currentView isKindOfClass:[UITableViewCell class]]) 
     { 
      return (UITableViewCell*)currentView; 
     } 
     currentView = currentView.superview; 
    } 
    return nil; 
} 

[tableView indexPathForCell:cell] 사용 전화 view.superview.superview를 하드 코딩하는 대신이 메소드를 사용하면 시스템의 버전을 통해 셀의 뷰 계층 구조에서 발생할 수있는 변경 사항을 처리 할 수 ​​있으므로 코드가 더 강력 해집니다.

+0

DCGoD의 대답에 설명 된대로 UITableView 메소드'indexPathForRowAtPoint :'를 사용하면 훨씬 더 간단하고 간단합니다. –

관련 문제