2014-09-24 9 views
12

Ben otomatik dinamik hücre yükseklikleri desteklemez öncesi iOS 8 içinÇalışma zamanı sistemi iOS sürümüne bağlı olarak bir yöntemi nasıl geçersiz kılarsınız?

self.tableView.rowHeight = UITableViewAutomaticDimension; 

kullanarak iOS 8 için otomatik dinamik tableview hücre yükseklikleri uyguladık, ben heightForRowAtIndexPath yöntemini overrided.

Bu ne yaptım bir benzer: Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

sorun iOS 8 için otomatik hücre yüksekliği kullanır ama önceki iOS sürümleri için heightForRowAtIndexPath geçersiz kılan kod yazmak nasıl etmektir. Özel heightForRowAtIndexPath yöntemimi, yalnızca iOS sürümü 8'den küçükse istiyorum. Bunu nasıl yapacağınıza dair herhangi bir öneriniz var mı?

+3

Ayrıca sadece düşünebilirsiniz sorunu çözüldü:

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

Sonra heightForRowAtIndexPath içine aşağıdaki kodu eklendi iOS 7 ve iOS 8'de farklı bir veri kaynağı kullanmak (yani farklı bir sınıfın nesnesi) –

+0

@JesseRusak kesinlikle doğrudur ve bu önerilen uygulamadır. Çalışma zamanında uygun beton uygulamasını sağlayan veri kaynağınız için bir sınıf kümesi oluşturun. – quellish

cevap

19

Görünüm denetleyicinizdeki bir çözüm, respondsToSelector: yöntemini geçersiz kılmak olacaktır. heightForRowAtIndexPath: yöntemini denetlerken iOS 8 altında NO döndürün. iOS 7 veya daha önceki altında iOS 8 veya daha yeni ve YES altında NO dönecektir

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

Kodunuzdaki: Tablo görünümü gibi bir çağrı yapmak

- (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]; 
} 

Bu şekilde,.

+0

Bunu UITableViewController' için bir kategori olarak ekledim, böylece her bir tanesine eklemek zorunda değilsiniz. Ayrıca seçicinin 'tableView: estimHeightForRowAtIndexPath:' olup olmadığını test edebilirsiniz, çünkü bunun iOS8 için de gerekli olmadığını düşünüyorum. – Koen

+0

@Koen Tanımlanmamış bir davranış olduğu için, bir kategorideki bir yöntemi geçersiz kılmak tehlikelidir. Çalışabilir veya olmayabilir. – rmaddy

+0

İyi bir nokta, kategoriyi kaldıracağım ve bunu her bir "UITableViewController" öğesine ekleyeceğim – Koen

1

Basit bir çözüm buldum. kullanıcı daha sonra iOS 8.0 veya varsa tanımak için bu makro Beyan:

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

} 

Bu

+1

Bu yaklaşımın olumsuz tarafı, bir çok performans kazancınızı kaybediyor. Tablo, "heightForRowAtIndexPath" temsilci yöntemini uyguladığınızı gördüğünden, her satır için bunu çağırır. Çözümüm size performans kazancını geri veriyor. – rmaddy

İlgili konular