2011-02-11 20 views
21

Kullanıcı UISearchBar içinde yazarken arama sonuçlarını XML'de karşıdan yükleyen basit bir uygulama var. indir + ayrıştırma dişli ve bir kez İşte [tableView reloadData];[tableView reloadData]; Tablo kaydırma yapana kadar çalışmazWatch

için tablo görüntüsü ViewController anlatmak için bir NSNotification ateşler yapılır ise sonuçların kez ateş bildirim alır kodudur: Ben olsun

- (void)receivedResults:(id)notification { 
    results = [notification object]; 
    DLog(@"Received %i results",[results count]); 
    [[self tableView] reloadData]; 
} 

"Alınan 4 sonuç" günlük çıkışı, ancak tablo görünümü, bir çift piksel kaydırıp/sürükleyene kadar verileri yeniden yüklemiyor. Yerleşik UITableViewCellStyleSubtitle hücre stilini kullanıyorum ve yüksekliği değiştirmeyeceğim ya da tablo görünümünde herhangi bir şey fantezi bırakmayacağım.

Neyi yanlış yapıyorum?

+0

sonuç aramadan sonra etrafında tablo görünümü çekerken aksi Yukarıdaki kod bile işe yaramaz tabii bir örnek değişkeni ve tablo görünümü için kaynak taşımaktadır. –

+0

emin [self tableView] nil iade etmez? Yeniden yüklemenin yanıt vermemesinin nedeni olabilir, ancak cellForRowAtIndexPath bunu yapar.Bu yöntem delege tarafından çağrılır. –

cevap

65

I aynı şey işe başardı. Ancak sorun, ana iş parçacığı üzerinde yeniden yüklenmesi gereken verilerin olmasıydı.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 

Bu

+0

Bunun çok daha pratik olup olmadığını bilmiyoruz, ancak Apple GCD'yi performSelector ... deseni lehine önermektedir. –

+0

@MaciejSwic Bu özel soru için doğru çözüm bu olmalıdır. Sorun, OP'nin UI'yi bir arka plan iş parçacığı üzerinde değiştirmeye çalışmasıdır, büyük olasılıkla dışarı çıkmayı unutmuştur. PerformSelectorOnMainThread'i sadece bir çalışma olarak çağırmamalısınız. –

+0

Bu benim için düzeltmedi. Sorunum çok benzer, ancak hücrelerin yalnızca içeriğinin tamamen görüntülenip tekrar görünümüne kaydırıldıklarında içeriğini gösterdiği varyasyonlarla. Şimdiye kadar bu kadar şaşkınım ... :-( –

34

Çağrı

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

yerine

[self.tableview reloadData] 
+0

Güzel, Verileri NSNotification için olay işleyicisine yeniden yüklüyordum. – NMunro

4

Benim sorunum arka plan parçacağından NSNotification gönderme olmasıydı performSelectorOnMainThread seçeneğinden daha pratik olduğunu düşünüyorum. Bunu önlemek için, sadece böyle bir dispatch_async stilini postNotificationMethod sarın:

bu bildirim alınacak
dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FinishedDownloading" object:result]; 
}); 

, tableView.reloadData ana iş parçacığı üzerinde çağrılacak.

0

Aynı sorunu yaşıyorum ve google'da bulabildiğim tüm çözümleri denedim. Ama hepsi işe yaramıyor.

Sonunda, viewDidLoad öğesinden önce gözlemci eklediğimi ve sonra [self.tableView reloadData] çalışmadığını buldum.

Önce root navigasyon görünümü denetleyicimin viewDidLoad öğesinde setObserverForUserInfoDatabase'i çağırıyorum. Çünkü daha önce çağrıldığını düşünüyorum. fonksiyonu şu şekildedir:

- (void)setObserverForUserInfoDatabase:(NSString *)name { 
    [[NSNotificationCenter defaultCenter] addObserverForName:name 
                 object:nil 
                 queue:nil 
                usingBlock:^(NSNotification *note) { 
                 [self loadUserInfo]; 
                 [self.tableView reloadData]; 
                 NSLog(@"User Panel Notification \n %@", self); 
                }];} 

Sonra viewController kendisinin viewDidLoad içine kodunu taşıyın.

- (void)viewDidLoad { 
    NSLog(@"View Did Load"); 
    [super viewDidLoad]; 

    [self setObserverForUserInfoDatabase:UserInfoDataBaseAvailabilityNotification]; 
} 

Ve sonra her şey iyi çalışıyor.

Henüz sebebini bilmiyorum. eger birisi biliyorsa lutfen bana soylesin.

+0

setObserverForUserInfoDatabase ne yapar ve daha önce nerede yapıldı? –

+0

Bu işlev sadece gözlemci ekleyin.GerrorViewController ViewDidLoad içine koyun. çalışmıyor – wgr

0

yeniden senin tableViewviewWillLayoutSubviews yılında

İlgili konular