UITableViewCell очень медленный ответ на выбор

У меня есть простой 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

но на самом деле предупреждение не отображается на экране.

Будем благодарны за любые предложения или указания, где найти решение.

12 голосов | спросил Max 6 PM00000090000005931 2015, 21:12:59

6 ответов


0

Решение очень странное

вместо

cell.selectionStyle = UITableViewCellSelectionStyle.None

с

cell.selectionStyle = UITableViewCellSelectionStyle.Default

полностью решит проблему. После этого каждый щелчок по строке сразу же показывает результат.

ответил Max 7 PM00000060000005231 2015, 18:24:52
0

поместите его в функцию 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.None для cell.selectionStyle = UITableViewCellSelectionStyle.Default

ответил Akshay Thakur 24 FebruaryEurope/MoscowbFri, 24 Feb 2017 10:48:53 +0300000000amFri, 24 Feb 2017 10:48:53 +030017 2017, 10:48:53
0

Если вы хотите, чтобы selectionStyle было None, добавьте alertView метод для dispatch_async(dispatch_get_main_queue(),^{...}); или установите для selectionStyle значение по умолчанию.

ответил jyz 12 AMpWed, 12 Apr 2017 07:00:11 +030000Wednesday 2017, 07:00:11
0

У меня была точно такая же проблема, определенно ошибка. В моем случае это было добавление дополнительных 150 мс перед загрузкой представления.

У меня была пользовательская ячейка таблицы с

cell.selectionStyle = UITableViewCellSelectionStyle.None

изменив его на

cell.selectionStyle = UITableViewCellSelectionStyle.Default

исправил проблему ...

ответил Greg Ingelmo 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2015 05:33:03 +0300 2015, 05:33:03
0

я обнаружил, что использовать жест лучше, чем didselect делегат, если в ячейке есть изображение

так

iv.userInteractionEnabled = YES;

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];

tap.numberOfTapsRequired = 1;
[iv addGestureRecognizer:tap];
ответил chings228 24 FebruaryEurope/MoscowbFri, 24 Feb 2017 10:36:06 +0300000000amFri, 24 Feb 2017 10:36:06 +030017 2017, 10:36:06
0

В моем случае мне нужно иметь стиль выделения .none, потому что я использую настроенные ячейки. Поэтому я должен работать с didHighlightRowAt и didUnhighlightRowAt. Когда вы используете .default, вы не можете обрабатывать эти события.

Для меня DispatchQueue.main.async{} добился цели!

ответил Neneil 14 MaramWed, 14 Mar 2018 01:47:57 +03002018-03-14T01:47:57+03:0001 2018, 01:47:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132