didSelectRowAtIndexPath后延迟

ßar*_*ron 7 cocoa-touch uitableview ios swift

我有一个自定义单元格的tableview,当我点击我的一个单元格时,它会向我显示下一个viewcontroller,但是有一段延迟有时会达到5秒.

我怎样才能摆脱延迟?

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)
}
Run Code Online (Sandbox Code Playgroud)

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.
}
Run Code Online (Sandbox Code Playgroud)

}

ZHZ*_*ZHZ 25

我有同样的问题,似乎这是iOS的错误.解决了以下解决方案.

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)
    }
Run Code Online (Sandbox Code Playgroud)

Swift3版本:

DispatchQueue.main.async {
    self.presentViewController(personViewController, animated: true,completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

  • 不需要`asyncAfter(deadline..`.`DispatchQueue.main.async {...`也可以. (3认同)

Bey*_*hao 6

也许你会打电话给这个方法

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在推送ViewController或其他操作之前.喜欢

- (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 ....
}
Run Code Online (Sandbox Code Playgroud)

那解决了我的问题.当我为模型样式自定义过渡viewController时


Arm*_*min 0

当有人点击单元格后,您将加载两个图像并从故事板实例化视图控制器。这涉及一个繁重的过程,并且可能需要时间,具体取决于视图控制器的复杂程度以及这些图像的大小。

现在,您可以将图像加载代码移动到viewDidAppear()或异步加载图像,然后分配它们。


另一种方法可能是使用imageWithContentsOfFile:加载图像。显然这种方法更快并且使用更少的内存

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

UIImage *currentImage = [UIImage imageWithContentsOfFile:file];
Run Code Online (Sandbox Code Playgroud)