2016-02-21 31 views
5

Saatlerce bu sorun üzerinde başımı beceriyor oldum, ama her zaman böyle bir şey deneyin:insertRowsAtIndexPaths neden her zaman TableView'ın en üste gelmesine neden oluyor?

self.dataArray.append(newCellObj) 

ve sonra bunu:

self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

UITableView otomatik için kayar sayfanın üst kısmı.

denemek bile:

self.tableView.scrollEnabled = false 
    self.tableView.beginUpdates() 
    self.tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top) 
    self.tableView.endUpdates() 

UITableView bile hala tamamen devre dışı kaydırma ile üstüne kayar. ScrollView öğesinin tam olarak insertRowsAtIndexPaths çağrıldıktan sonra en üste kaydırmasına neden olan nedir?

Bu sorunla ilgili tek çözüm bu kullanmaktır: yerine

self.tableView.reloadData() 

. Bunun yerine reloadData kullanırsam, ama tutmak istediğim güzel animasyonu kaybederim.

Ben de self.tableView.scrollsToTop = false var ve ben bir şekilde kaydırma devre dışı verebilecek böyle birçok yapılandırmaları denedim ama ben OP aynı sorunla karşılaşmış olan insertRowsAtIndexPaths

+3

üzerinde estimatedRowHeight daha doğru ayarlamak

  • devre dışı otomatik düzen Bence başka bir kodun burada kötü tepki gösterebileceğini düşünüyorum. En üste kaydırılmaması gerektiği konusunda haklısınız. Başlangıç ​​/ bitiş güncellemeleri arasında olmadan denediniz mi? * Uygun olabilecek başka bir kod var mı? –

  • +1

    @RyanPoolos Teşekkürler dostum, benim için başlangıç ​​/ bitiş güncellemeleri olmadan daha iyi çalışıyor. : D –

    cevap

    12

    sonra bu geçersiz kılan bir şey var. Ek olarak, bazen benim tablo görünümü hücrelerim "boş" gider ve tamamen kaybolur, bu da beni this related question'a götürdü.

    Benim için

    , çözüm aşağıdaki BİRİNİ yapmanız oldu:

    • uygulamak func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
    • benim UITableView
    +3

    TEŞEKKÜR EDERİZ! 'tahminiHeightForRowAtIndexPath' sorunu tamamen çözmüş görünüyor! Bu değeri, tablodaki ortalama hücreden çok daha yüksek bir değere ayarladığımda, dizin dizisinde satır için maksimum bir yükseklik olarak hizmet veriyor gibi görünüyor, hile yapmış gibi görünüyor. Ayrıca otomatik düzeni de açık tutmayı başardım! : D Projemin tümünde bu "güncelleme tablosu görünümü" işlevlerinden birkaç tane var, her biri tamamen farklı bir hücre sınıfı ve her biri sabit bir şekilde tahmin edilen Highty hile. Buna alternatif olarak manuel heightForRowAtIndexPath. – Mateusz266

    +2

    Sen bir efsanesin! Çok teşekkür ederim!!! – Gix

    +0

    Aynı problem var ama 'tahminiHeightForRowAtIndexPath' ve 'tahminiRowHeight' işe yaramadı. – lee

    0
    - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        return UITableViewAutomaticDimension; 
    } 
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        return UITableViewAutomaticDimension; 
    } 
    
    // I'm use auto layout and this variant without animation works 
    // ...insert object to datasource 
    NSUInteger idx = [datasource indexOfObject:myNewObject]; 
    if (NSNotFound != idx) 
    { 
        NSIndexPath *path = [NSIndexPath indexPathForRow:idx inSection:0]; 
        [self.table beginUpdates]; 
        [self.table insertRowsAtIndexPaths:@[path] 
             withRowAnimation:UITableViewRowAnimationNone]; 
        [self.table endUpdates]; 
        [self.table scrollToRowAtIndexPath:path 
             atScrollPosition:UITableViewScrollPositionBottom 
               animated:NO]; 
    } 
    
    İlgili konular