2011-04-16 31 views
18

Belirli koşullar altında, UITableView didSelectRowAtIndexPath iki kez çağrılıyor ve hataya neden oluyor Pushing the same view controller instance more than once is not supported.UITableView iki kez çağrıldı didSelectRowAtIndexPath

İşte olayların sırası şunlardır:

TableView::didSelectRowAtIndexPath. 
TableView::viewWillDisappear. 
PushedViewController::viewWillAppear. 
TableView::didSelectRowAtIndexPath. 
Error: Pushing the same view controller instance more than once is not supported' 

kayda değer tek şey UITableView uyumsuz görüntüleri yüklenmekte olduğunu, ama bu asla didSelectRowAtIndexPath çağırır. Ayrıca, PushedViewController UITableView'da bir hücre seçildiğinde her seferinde yeniden yüklemekten kaçınmak için yeniden kullanılır.

Buna neden olabilecek herhangi bir fikri olan var mı? Teşekkürler.

+0

Bazı ilgili kodları yayınlayın? – Jamie

+0

u r callin deselectrowatindx yolunun seçilmediğinden emin olun ...... – Ravin

+0

Raving, ben birini istemiyorum. Jamie, hangi ilgili kod? Bir pushViewController var ve sonra yukarıdaki (her zaman değil) olur. –

cevap

1

İlk "didSelectRow" öğesinden sonra kullanıcı etkileşimini devre dışı bırakın. Geçiş sırasında birden fazla dokunuşun "yığılması" mümkündür.

Genellikle bu davranışı almak için parmaklarında harika el becerisi olan birisini alır, ancak yine de.

+0

[Bu davranışı elde etmek için parmaklarında harika bir beceriye sahip biri]. Haklısın, ama oluyor. Bunu daha önce gördüğün anlamına mı geliyor? IOS'ta bir hata olabilir mi? –

+7

Biri lanet olası test cihazı gibi inanılmaz bir el becerisi olan birisi –

+0

Adam, evet, bu doğru. @ED. : iOS'ta bir hata mı, yoksa söyleyemem. Yanlışlıkla görülmediyse, yaban hayatında da kesinlikle iOS 7'de görüldüğü gibi. –

32

Bu sorunu da görüyorum, muhtemelen 1000 kullanıcıdan biri etkileniyor veya daha az etkileniyor. Açıkça görüldüğü gibi, iki tane 50 ms sonra birbirini takip eden didSelectRowAtIndexPath. Tahminim, iOS'ta bir hata olması - yeni görüntüleme denetleyicisi itildikten sonra eski görünümlere yönlendirilmemelidir. Ne yazık ki, buna karşı kod koruması yazmamız olasıdır. İşte Düşünüyorum ne: segue size didSelectRowAtIndexPath yönteminin içine kullanarak çünkü

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { 
     if (self.navigationController.topViewController != self)   
      return; 

    ... do other stuff 

    } 
+4

Bu düzeltme basit ve çalışır. btw: Uygulamamda istediğim zaman bu sorunu yeniden üretebildim. 1. uygulamayı açın. 2. internetten bilgi yükleyen tablo görünümü denetleyicisine gidin. 3. yükleme sırasında deli gibi herhangi bir satıra dokunun. 4.Birkaç tane DidSelect tetiklenir ve detailViewController bir kereden fazla itilir – AmitP

+1

Bu problemi, özel bir şekilde el ile bir segue gerçekleştirirken didSelectRowAtIndexPath. Bunun meşru hücre seçimlerini önleyemeyeceğinden emin olmak için bazı testler yaptım, ve bak, bir çekicilik gibi çalışıyor! – averydev

0

ortaya çıkar. Bu denetimin, kaynak görüntüleme denetleyicisinin üstündeki görünüm düğmesinden hedef görüntüleme denetleyicisine sürükleyerek ctrl tarafından oluşturulduğundan emin olun. Hata, ctrl tablo görünümü hücreden hedef görünümü denetleyicisine sürükleyerek segue oluşturduğunuzda oluşur. Herhangi bir kodunuzu değiştirmeniz gerekmez. Sadece segue'i silin ve doğru şekilde oluşturun. Soruyu doğru bulursam, bu senin sorunun çözülmesini umarım. Storyboard Segue'i henüz yaratmadıysanız,

1

; Bu yöntemde

[self performSegueWithIdentifier:@"TYPE" sender:self];

;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

İlgili konular