2011-12-16 15 views
16

Bir Storyboard'da hücreleri olan bir UITableView ve hücreleri başka bir görünüme bağlayan bir segue var.UITableViewCells bir segue'den dönerken seçimi kaldırmıyor

Bir hücre seçtiğinizde, hücre seçim animasyonunu görüntüler (hücremdeki griyi döndürürüm) ve diğer görünümü ekrana iter. Ancak tablo görünümüne döndüğünüzde, seçim kaldırma animasyonu hiç gösterilmez (seçim animasyonunun tersi). Sadece bir segue kullandığım için, bunun varsayılan olarak halledilmesini bekledim.

Seçme animasyonunu göstermek için onu zorlamanın bir yolu var mı?

+0

için Bulunan burada çözüm: http://stackoverflow.com/sorular/1840614 /-neden yaptığını-UITableView hücre-kalır-vurguladı. –

cevap

11

emin değil viewWill... ve viewDid... yöntemlerden super uygulamalarını aradığınız ama sık sık bir görünüm denetleyicisi göründüğünde verilerini yenilemek istiyorum emin olun. Ancak tabloyu yeniden yüklerseniz, seçim satırını temizlersiniz. Burada, seçili bir satırı korumak için kullandığım ve dönerken dönüşü olmayan animasyonu gösterdiğim bazı kodlar var. Bu size yardımcı olabilir, bu yüzden burada yayınlayacağım olabilir.

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    [tableView reloadData]; 
    if(indexPath) { 
     [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    } 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    NSIndexPath *indexPath = [tableView indexPathForSelectedRow]; 
    if(indexPath) { 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 
} 
+0

Tablo verilerini yeniden yüklüyorum, ancak çözümünüz işe yaramadı. (Daha önce denedim, ama tekrar denediğimden emin olmak için.) –

+0

Tabloyu başka bir yere mi yüklüyorsunuz? Ayrıca, viewWillAppear'ı çağırmadan önce seçilen satırı kaldırmayacağınızdan emin olun. Verilerinizin nasıl değiştiğine bağlı olarak, aynı satırın yeniden seçilmesi sizin için çalışmayabilir. – Chase

+0

Bu sorunu hiç çözmediğim halde kabul ettim. Sanırım bir yerlere yeniden yükleme yapmalıyım. –

22

Görünüm denetleyiciniz UITableViewController alt sınıfı ve clearsSelectedOnViewWillAppearYES olarak ayarlanmışsa (bu varsayılan değerdir) otomatik olarak işlenir.

Sizin durumunuzda, bunu UITableViewController'un yaptığıyla aynı şekilde yapabilirsiniz. Seçilen satırı -viewWillAppear:'dan kaldırın.

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; 
    [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:YES]; 
} 
+0

Görünüm denetleyicim UITableViewController'ın bir alt sınıfıdır. Hücre, gösterildiğinde seçili değil, yalnızca bir animasyon göstermiyor - başlangıç ​​olarak seçilmemiş. (Her durumda, önerdiğin şeyi denedim ve işe yaramadı.) –

+0

Başka bir görüntü denetleyicisine basan bir 'UINavigationController' içinde bir 'UITableViewController' ile bir örnek proje oluşturdum. Tümüyle bir storyboard kullanarak seggs ve view denetleyicisi haşhaş, deselection animasyonu görüntüler. Belki de orijinal görüntü denetleyicinin görünümü kaldırılıyor, böylece tablonun seçim durumu kayboluyor. Yüksek bellek basınç durumlarında bu olabilir. –

+0

Uygulamam siz açıkladığınız şekilde (ancak sekmelerle birlikte) kurulmuş ve Çekirdek Verileri kullanmaktadır. Şu anda taleplerin çoğu sadece iki veya üç kayıttır (test için), bu yüzden bellek kaynakları üzerinde bir drenaj olacağını düşünmüyorum. –

9

Eğer segues kullanımı konusunda

+0

Bunu her miras alınan yöntemde yapıyorum. –

+0

UITableViewController ürününüze nasıl dönüyorsunuz? Film şeridinde bir "push" segue kullandığınızda ücretsiz olarak gelen varsayılan geri düğmesini kullanıyor musunuz? –

+0

Ben. Benim UITableViewController bir UINavigationController içinde, ve navigasyon denetleyicisinin yarattığı geri düğmesiyle ayrıntı görünümünden tablo görünümüne dönüyorum. (ve segue "push" tipi) –

1

Swift Güncelleme: -

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(true) 
    if tableView.indexPathForSelectedRow != nil { 
     let indexPath: NSIndexPath = tableView.indexPathForSelectedRow! 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    } 
} 
1

Daha İyi Swift güncelleme:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRowAtIndexPath(path, animated: true) 
    } 
} 
2

Swift 3

override func viewWillAppear(_ animated: Bool) { 

    super.viewWillAppear(animated) 
    if let path = tableView.indexPathForSelectedRow { 

     tableView.deselectRow(at: path, animated: true) 
    } 
} 
İlgili konular