2015-02-03 16 views
5

Ich habe eine Tabellenansicht mit benutzerdefinierten Zellen, wenn ich auf eine meiner Zellen tippen zeigt es mir den nächsten Viewcontroller wie es sein sollte, aber es gibt eine Verzögerung, die manchmal bis zu 5 Sekunden geht.Verzögerung nach didSelectRowAtIndexPath

Wie kann ich die Verzögerung loswerden?

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

Könnten Sie bitte Ihre 'PersonViewController' Initialisierungscode? Es ist wahrscheinlich, dass der 'PersonViewController' die Verzögerung verursacht. – Armin

+0

@Armin Ich habe meinen PersonViewController Code –

+0

hinzugefügt Können Sie zuerst nur ein Bild dann beide Bilder entfernen und prüfen, ob die Verzögerung noch da ist? –

Antwort

0

Sie laden zwei Bilder und eine View-Controller aus dem Storyboard instanziieren, nachdem jemand auf einer Zelle tippt. Dies ist mit einem schweren Prozess verbunden und kann abhängig davon, wie kompliziert Ihr View-Controller ist und wie groß diese Bilder sind, dauern.

Jetzt können Sie entweder Ihren Bildladecode auf viewDidAppear() verschieben oder die Bilder möglicherweise asynchron laden und dann zuweisen.


könnte eine andere Art und Weise sein imageWithContentsOfFile: zu verwenden, um die Bilder zu laden. Anscheinend ist diese Methode schneller und uses less memory.

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

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

Meine Bilder sind alle weniger als 200KB, ich habe gerade versucht, sie zu verschieben 'viewDidAppear()' und es hatte in der Tat keine Verzögerung, nur die Bilder laden etwa 1sec später, die ich nicht bevorzuge zu. Ich werde nachsehen, wie man das asynchrone Laden durchführt und Ihnen sagen, wie es geht. –

+0

200KB ist nicht klein, wenn es um die Anzeige von Bildern geht. Das Laden dieser Bilder wird diese Zeit benötigen, es sei denn, Sie laden sie anders! Versuchen Sie 'imageWithContentsOfFile:' zum Beispiel. Offensichtlich verwendet es viel weniger Speicher und speichert das Bild nicht zwischen, also sollte es schneller sein. – Armin

+0

Meine Antwort wurde mit einem Beispiel aktualisiert. – Armin

14

Ich habe das gleiche Problem und es scheint, dass dies ein Fehler von iOS ist. Gelöst mit der folgenden Lösung.

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 Version:

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

Format Antwort gut – Vikrant

+0

formatiert die Antwort – ZHZ

+0

Dies funktioniert sehr auf meinem iPhone 5 mit iOS 9. – Donald

4

Vielleicht werden Sie die Methode

[tableView deselectRowAtIndexPath:indexPath animated:NO];

vor Push-Viewcontroller oder andere Operation aufrufen. Wie

- (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 .... 
} 

das ist mein Problem zu lösen. Wenn ich benutzerdefinierten Übergang ViewController für Model Style

+0

Dies funktioniert für Swift 3 iOS 10.2 beim Präsentieren von UIAlertController oder UIViewControllers: Swift 3: tableView.deselectRow (at: indexPath, animiert: false) – Wizkid

+0

Wenn Sie jedoch andere Funktionen haben, die von indexPath über tableView.indexPathForSelectedRow.row abhängen, werden Sie Der Indexpfad ist nicht mehr verfügbar, es sei denn, Sie speichern ihn – Wizkid

+0

Absolut haben Sie Recht. –

Verwandte Themen