【问题标题】:Delay after didSelectRowAtIndexPathdidSelectRowAtIndexPath 之后的延迟
【发布时间】:2015-02-03 20:09:12
【问题描述】:

我有一个带有自定义单元格的表格视图,当我点击其中一个单元格时,它会向我显示下一个视图控制器,但有时会延迟 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)
}

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

}

【问题讨论】:

  • 能否请您提供您的 PersonViewController 初始化代码? PersonViewController 很可能导致延迟。
  • @Armin 我已经添加了我的 PersonViewController 代码
  • 你能先删除一张图片,然后再删除两张图片并检查延迟是否仍然存在吗?
  • @zelb 我删除了一个,延迟仍然存在

标签: ios swift uitableview cocoa-touch


【解决方案1】:

我有同样的问题,似乎这是 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)
    }

Swift3 版本:

DispatchQueue.main.async {
    self.presentViewController(personViewController, animated: true,completion: nil)
}

【讨论】:

  • 愚蠢的错误! Grrrrrr ...浪费了我的时间。谢谢!
  • Weil,愚蠢的错误,为什么苹果几年后不修复这个错误?
  • 不需要asyncAfter(deadline..DispatchQueue.main.async {... 也同样有效。
  • 完美!谢谢
  • 2019 年中,仍然是同样的问题。感谢上帝仍然是同样的解决方案!谢谢!
【解决方案2】:

也许你会调用方法

[tableView deselectRowAtIndexPath:indexPath animated:NO];

在 Push 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 ....
}

这解决了我的问题。当我为模型样式自定义转换视图控制器时

【讨论】:

  • 这适用于 Swift 3 iOS 10.2 在呈现 UIAlertController 或 UIViewControllers 时:Swift 3: tableView.deselectRow(at: indexPath, animated: false)
  • 但是,如果您有其他通过 tableView.indexPathForSelectedRow.row 依赖于 indexPath 的函数,除非您保存它,否则您将不再拥有 indexPath 可用
【解决方案3】:

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

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


另一种方法是使用imageWithContentsOfFile: 加载图像。显然这种方法更快,uses less memory.

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

UIImage *currentImage = [UIImage imageWithContentsOfFile:file];

【讨论】:

  • 我的图片都小于 200KB,我只是尝试将它们移动到viewDidAppear(),它确实没有延迟,只是图像加载大约 1 秒后我不喜欢。我会看看如何进行异步加载并告诉你这是怎么回事。
  • 200KB 在显示图像方面并不小。加载这些图像会花费一些时间,除非你以不同的方式加载它们!例如尝试imageWithContentsOfFile:。显然它使用的内存要少得多,并且不缓存图像,所以它应该更快。
  • 用一个例子更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多