UITableViewCell의 하위 View 접근할 때 iOS6, iOS7 차이.
iOS6에서 UITableViewCell 위에 올라간 UILabel, UIButton 등의 객체를 참조할 때의 코드가 iOS7에서 조금 변경되었다.
- iOS6
UITableViewCell
↳ UITableViewCellContentView
↳ UILabel ...
- iOS7
UITableViewCell
↳ UITableViewCellScrollView <- 추가됨.
↳ UILabel...
↳ UITableViewCellContentView
↳ UILabel ...
그래서 iOS6에서 Cell 아래에 있는 Label등에 접근할 때, 또는 Cell 위에 아래와 같이 버튼을 올렸을 경우
UIButton *button3 = [UIButton buttonWithType:UIButtonTypeCustom]; [button3 setFrame:CGRectMake(14, 5, 100, 113)]; [button3 addTarget:self action:@selector(cellButtonAction:) forControlEvents:UIControlEventTouchUpInside]; [cell.contentView addSubview:button3]; |
- iOS6까지는 아래와 같이 접근이 가능했음.
UITableViewCell *cell = (UITableViewCell *)[[(UIView *) sender superview] superview]; UITableView *tableView = (UITableView *)[cell superview]; NSIndexPath *cellIndexPath = [tableView indexPathForCell:cell]; NSUInteger row = [cellIndexPath row]; |
- iOS7 에서는 Cell과 ContentView 사이에 UITableViewCellScrollView 가 추가되고,
UITableView와 Cell 사이에 UITableViewWrapperView가 추가되었다. 그래서 접근하기 위해서는 superview가 더 필요하다.
UITableViewCell *cell = (UITableViewCell *)[[[(UIView *) sender superview] superview] superview]; UITableView *tableView = (UITableView *)[[cell superview] superview]; NSIndexPath *cellIndexPath = [tableView indexPathForCell:cell]; NSUInteger row = [cellIndexPath row]; |
* UITableViewCellScrollView?
- UITableViewCell에 추가된 Private Class.
- iOS7에서 Cell을 삭제할 때 왼쪽으로 스크롤해야하는데, 이 때 사용되는 것으로 보임.
* UITableViewWrapperView?
- Private Class 같은데, 용도를 아직 모르겠음.
--------------------------
추가사항.
위에서 예로 든 경우 superview를 이용해서 접근하고 있는데, 아래와 같은 방법으로 이용하는게 좀 더 안전한 방법임을 다른 분이 알려줌.
- (void)btnPressed:(id)sender
{
CGPoint btnPos = [sender convertPoint:CGPointZero toView:tableView];
NSIndexPath *ip = [tableView indexPathForRowAtPoint:btnPos];
if (ip != nil) {
...
}
}