UITableViewCell选择响应非常慢

时间:2015-08-06 18:13:00

标签: ios swift uitableview uikit

我有一个简单的UITableViewController和基本单元格。 didSelectRowAtIndexPath做了简单的工作 - 只需制作UIAlertView并显示它。

问题是当我点击一行时有时会立即看到警报,有时几秒钟后(最多10秒)。

代码是

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    tableView.delegate = self
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as! UITableViewCell
    cell.selectionStyle = UITableViewCellSelectionStyle.None
    // Configure the cell...
    cell.textLabel?.text = "\(indexPath.row)"
    return cell
}


override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    NSLog("row clicked at index \(indexPath.row)")
    let alert = UIAlertView(title: "Test", message: "Test message", delegate: self, cancelButtonTitle: "Done")
    alert.show()
    NSLog("alert showed")
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 4
}

在日志中我看到

2015-08-06 20:51:54.591 experimental[10323:8602172] row clicked at index 2
2015-08-06 20:51:54.595 experimental[10323:8602172] alert showed
2015-08-06 20:52:00.901 experimental[10323:8602172] row clicked at index 3
2015-08-06 20:52:00.905 experimental[10323:8602172] alert showed

但实际警示屏幕上没有显示。

任何建议或指向哪里可以找到解决方案将不胜感激。

6 个答案:

答案 0 :(得分:22)

解决方案非常奇怪

替换

cell.selectionStyle = UITableViewCellSelectionStyle.None

cell.selectionStyle = UITableViewCellSelectionStyle.Default

完全解决问题。之后每次点击行都会立即显示结果。

答案 1 :(得分:3)

将它放在DispatchQueue.main.async函数中。

DispatchQueue.main.async{

let alert = UIAlertView(title: "Test", message: "Test message", delegate: self, cancelButtonTitle: "Done")     alert.show()     NSLog("alert showed") }

replace cell.selectionStyle = UITableViewCellSelectionStyle.Nonecell.selectionStyle = UITableViewCellSelectionStyle.Default

答案 2 :(得分:1)

如果您希望selectionStyle为无,则应将alertView方法添加到dispatch_async(dispatch_get_main_queue(),^{...}); 或将selectionStyle设置为默认值。

答案 3 :(得分:0)

我有同样的问题,绝对是一个错误。在我的情况下,它在加载视图之前增加了150ms。

我有一个带

的自定义表格单元格
cell.selectionStyle = UITableViewCellSelectionStyle.None

将其更改为

cell.selectionStyle = UITableViewCellSelectionStyle.Default

解决了问题...

答案 4 :(得分:0)

在我的情况下,我需要选择样式.none,因为我使用自定义单元格。因此,我必须使用didHighlightRowAtdidUnhighlightRowAt。当您使用.default时,您无法处理这些事件。

对我来说DispatchQueue.main.async{}做了伎俩!

答案 5 :(得分:0)

尝试设置:

delaysContentTouches = false