2015-02-03 8 views
5

Ho una vista tabella con celle personalizzate, quando tocco su una delle mie celle mi mostra il prossimo viewcontroller come dovrebbe essere, ma c'è un ritardo che a volte arriva fino a 5 secondi.Ritardo dopo didSelectRowAtIndexPath

Come posso eliminare il ritardo?

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let person = persons[indexPath.row] 

    var personViewController: PersonViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PersonViewController") as PersonViewController 

    personViewController.name = person.name 
    personViewController.imageName = person.image 

    self.presentViewController(personViewController, animated: true, completion: nil) 
} 

PersonViewController

import UIKit 

class PersonViewController: UIViewController { 

@IBOutlet weak var personImage: UIImageView! 
@IBOutlet weak var overlayImage: UIImageView! 
@IBOutlet weak var nameLabel: UILabel! 

var name: String? 
var imageName: String? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    self.personImage.image = UIImage(named: imageName!) 
    self.overlayImage.image = UIImage(named: "image_overlay.png") //this is a filter 
    self.nameLabel.text = imageName 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

+0

Potresti includere il tuo codice di inizializzazione 'PersonViewController'? Probabilmente il 'PersonViewController' sta causando il ritardo. – Armin

+0

@Armin Ho aggiunto il mio codice PersonViewController –

+0

Puoi rimuovere prima solo un'immagine e poi entrambe le immagini e controllare se il ritardo è ancora lì? –

risposta

0

si caricano due immagini e istanziare un controller vista dallo storyboard dopo che qualcuno rubinetti su una cella. Ciò comporta un processo pesante e può richiedere del tempo a seconda di quanto sia complicato il controller della vista e di quanto siano grandi queste immagini.

Ora è possibile spostare il codice di caricamento dell'immagine su viewDidAppear() o caricare le immagini in modo asincrono e quindi assegnarle.


Un altro modo potrebbe essere quella di utilizzare imageWithContentsOfFile: per caricare le immagini. Apparentemente questo metodo è più veloce e uses less memory.

NSString *file = [[NSBundle mainBundle] pathForResource:@"image_name" ofType:@"jpg"]; 

UIImage *currentImage = [UIImage imageWithContentsOfFile:file]; 
+0

Le mie immagini sono tutte meno di 200 KB, ho appena provato a spostarle a 'viewDidAppear()' e in effetti non ha avuto alcun ritardo, solo le immagini caricano circa 1 secondo dopo che preferisco non a. Vedrò come eseguire il caricamento asincrono e dirti come sta andando. –

+0

200 KB non è piccolo quando si tratta di visualizzare le immagini. Caricando quelle immagini ci vorrà del tempo, a meno che tu non le carichi diversamente! Prova 'imageWithContentsOfFile:' per esempio. Apparentemente utilizza molta meno memoria e non memorizza nella cache l'immagine, quindi dovrebbe essere più veloce. – Armin

+0

Aggiornato la mia risposta con un esempio. – Armin

14

Ho lo stesso problema e sembra che questo sia un bug di iOS. Risolto con la seguente soluzione.

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 
    Int64(0 * Double(NSEC_PER_SEC))), 
    dispatch_get_main_queue()) {() -> Void in 
     self.presentViewController(personViewController, animated: true,completion: nil) 
    } 

Swift3 versione:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.0) { 
    self.presentViewController(personViewController, animated: true,completion: nil) 
} 
+1

format answer well – Vikrant

+0

formattato la risposta – ZHZ

+0

Funziona molto sul mio iPhone 5 con iOS 9. – Donald

4

Forse si chiamerà il metodo

[tableView deselectRowAtIndexPath:indexPath animated:NO];

prima spinta ViewController o altre operazioni. Mi piace

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

    // 1. manual call this method to deSelect Other Cell 
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

    // 2. than do other operation 
    PushViewController Or Some Animation .... 
} 

che risolva il mio problema. quando eseguo la transizione personalizzata viewController per Model Style

+0

Questo funziona per Swift 3 iOS 10.2 quando si presentano UIAlertController o UIViewControllers: Swift 3: tableView.deselectRow (at: indexPath, animato: false) – Wizkid

+0

Tuttavia, se si hanno altre funzioni che dipendono da indexPath tramite tableView.indexPathForSelectedRow.row, si non è più disponibile indexPath a meno che non lo salvi – Wizkid

+0

Assolutamente hai ragione. –

Problemi correlati