2014-09-24 1 views
12

I 자동 다이나믹 셀 높이를 지원하지 않는 사전 아이폰 OS 8 들어런타임 시스템 iOS 버전에 따라 메서드를 재정의하는 방법은 무엇입니까?

self.tableView.rowHeight = UITableViewAutomaticDimension; 

를 사용하여 아이폰 OS 8 자동 동적있는 tableview 셀 높이를 구현 한, I는 heightForRowAtIndexPath 방법 오버라이드.

이 내가 한 일에 유사하다 : Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

문제는 아이폰 OS 8 자동 셀 높이를 사용하지만 이전의 iOS 버전 heightForRowAtIndexPath을 무시하는 코드를 작성하는 방법이다. iOS 버전이 8 미만인 경우에만 내 사용자 지정 heightForRowAtIndexPath 메소드가 필요합니다. 어떻게해야합니까?

+3

당신은 또한 단지 고려해 볼 수 있습니다 문제를 해결 :

#define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 

다음을 heightForRowAtIndexPath 내부에 다음 코드를 추가 iOS 7 및 iOS 8에서 다른 데이터 소스 사용 (즉, 다른 클래스의 객체) –

+0

@JesseRusak은 절대적으로 정확하며 권장되는 방법입니다. 런타임에 적절한 구체화 구현을 제공하는 데이터 소스 용 클래스 클러스터를 만듭니다. – quellish

답변

19

하나의 솔루션은보기 컨트롤러에서 respondsToSelector: 메서드를 재정의하는 것입니다. heightForRowAtIndexPath: 방법을 확인할 때 iOS 8에서 NO을 반환 했습니까? 아이폰 OS 7 또는 이전 버전에서 아이폰 OS 8 이상 및 YES에서 NO를 반환합니다

if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) { 
} 

코드 : 테이블 뷰 같은 전화를 걸

- (BOOL)respondsToSelector:(SEL)selector { 
    static BOOL useSelector; 
    static dispatch_once_t predicate = 0; 
    dispatch_once(&predicate, ^{ 
     useSelector = [[UIDevice currentDevice].systemVersion floatValue] < 8.0 ? YES : NO; 
    }); 

    if (selector == @selector(tableView:heightForRowAtIndexPath:)) { 
     return useSelector; 
    } 

    return [super respondsToSelector:selector]; 
} 

이 방법.

+0

이것을'UITableViewController'의 범주로 추가 했으므로 모든 항목에 추가 할 필요가 없습니다. 또한 선택기가'tableView : estimatedHeightForRowAtIndexPath :'인지 테스트 할 수 있는데, iOS8에도 필요하지 않다고 생각하기 때문입니다. – Koen

+0

@Koen 정의되지 않은 동작이므로 범주의 메서드를 재정의하는 것은 위험합니다. 그것은 효과가있을 수도 있고 그렇지 않을 수도 있습니다. – rmaddy

+0

좋은 점은, 카테고리를 제거하고 이것을 모든 'UITableViewController'에 추가하는 것입니다. – Koen

1

간단한 해결책을 찾았습니다. 는 사용자가 나중에 아이폰 OS 8.0 이상이있는 경우 인식이 매크로 선언 :

if (IS_IOS_8_OR_LATER) { 
     self.tableView.rowHeight = UITableViewAutomaticDimension; 
     return self.tableView.rowHeight; 
    } else {//Custom code for ios version earlier than 8.0 

} 

+1

이 접근 방식의 단점은 성능 향상이 많이 손실된다는 것입니다. 이 테이블은 당신이'heightForRowAtIndexPath' 델리게이트 메소드를 구현 한 것을 보았기 때문에 모든 행에 대해 그것을 호출합니다. 내 솔루션을 사용하면 성능이 향상됩니다. – rmaddy