2016-04-22 2 views
2

Я снова открываю этот вопрос, потому что мой последний был отмечен как дубликат, даже если это на самом деле нет! Это та же проблема, но решения не работают с моим кодом. Я использую swift 2.UIButton | setTitle принимает огромное количество времени даже в основной теме

Так что моя проблема в том, что название гласит: у меня есть UIButton в tableViewCell, и когда я использую метод «setTitle», для обновления заголовка требуется от 10 до 60 секунд. В то же время я использую «addTarget», и он работает мгновенно. Поэтому заголовок должен также обновляться. Моя кнопка настроена как «обычай» в моей раскадровке.

Когда представление загрузки Я бегу следующий код:

/* viewDidLoad */

override func viewDidLoad() { 
    super.viewDidLoad() 
    boolAlready = false 
    findParticipation() 
} 

/* findParticipation */

func findParticipation() { 
    // After server request response : 
    boolAlready = true 
    self.tableView.reloadData() 
} 

/* cellForRowAtIndexPath */

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cellActions = tableView.dequeueReusableCellWithIdentifier(informationsCellArray[indexPath.row], forIndexPath: indexPath) as  ! eventDetailsAction 

    if boolAlready { 
     cellActions.foundParticipation 
    } else { 

     cellActions.btnParticipate.setTitle("...", forState: UIControlState.Normal) 
     cellActions.btnParticipate.addTarget(self, action: « deleteParticion", forControlEvents: .TouchUpInside) 
} 

/* В моих привычках клетка */

func foundParticipation() { 
    self.btnParticipate.setTitle("Annuler", forState: UIControlState.Normal) 
    self.btnParticipate.addTarget(self, action: "deleteParticipation", forControlEvents: .TouchUpInside) 
} 

Разные вещи, которые я нашел на форумах, которые не работали:

  1. Ставя свою SETTITLE действие вокруг dispatch_async(dispatch_get_main_queue()) {}

  2. заголовка настройки для все разницы UIControlStates

  3. Использование setAttributedTitle()

  4. Использование self.btnParticipate.setNeedsLayout() и self.btnParticipate.layoutIfNeeded() после SETTITLE

  5. перед отключением кнопки и включить его после SETTITLE

  6. self.addSubview(self.btnParticipate)

  7. Изменение названия в titleLabel.text

  8. Doing все упомянутый ранее в родительском представлении Controller, используя cellActions.btnParticipate

  9. UIView.performWithoutAnimation { self.btnParticipate.setTitle("Annuler", forState: .Normal) }

теперь я застрял и не может найти решение для этого.

+0

Итак, метод 'foundParticipation()' _allways_ называется в основном потоке? – werediver

+0

Да, он вызывается только в 'cellForRowAtIndexPath', который запускается' tableView.reloadData'. и вы можете использовать 'tableView.reloadData' только в основном потоке. –

ответ

0

Таким образом, после 1 мы ek попыток, я решил прекратить поиск ... Я просто вызываю функцию findParticipation() синхронно, и я не создаю экземпляр моего таблицы, пока не найду ответ.

Я знаю, что это хуже для UX, но еще меньше времени ждать.

0

Вы можете использовать

reloadRowsAtIndexPaths(_:withRowAnimation:) 

для принудительной перезагрузки клетки.

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

Для справки: Apple Docs - UITableView reloadRowsAtIndexPaths

EDIT:


Вы должны вызвать этот метод, когда какое-либо событие увольняют, запрашивает, закончил и т.д., чтобы обновить ячейку. У меня был второй взгляд на ваш код, и кажется, что ваш if-else в ячейке для строки на пути индекса не делает то, что он должен делать. Вы не должны называть там какие-либо «действия-выполнение-методы». Его просто для инициализации.

Ваша проблема в том, что ваш boolean boolAlready одинаковый для всех ячеек. Это приведет к тому, что никогда не будет выполняться else-block. Поэтому заголовок не задан или его просто установить, если для bool установлено значение false. Вероятно, вы должны напечатать bool. И/или обновите свой пост с дополнительной информацией.

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

+0

Это решение не работает. Но я не уверен, правильно ли я использовал его. То, что я сделал, когда моя ячейка была создана, я добавил indexPath к массиву, который был передан моему UITableViewCell, и я запустил этот метод сразу после setTitle. –

+0

смотреть редактирование пожалуйста. – Maik639

0

Попробуйте обернуть setTitle вызов в performWithoutAnimation:

UIView.performWithoutAnimation { 
    self.btnParticipate.setTitle("Annuler", forState: .Normal) 
} 
+0

Это, кажется, не вносит никаких изменений. –

0

Ваш вопрос, когда вы создаете ячейку функция btnParticipate не будет работать должным образом, Вы должны закодировать все те условия, в Func Tableview (Tableview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath метод)

Попробуйте

let cellActions = tableView.dequeueReusableCellWithIdentifier(informationsCellArray[indexPath.row], forIndexPath: indexPath) as  ! eventDetailsAction 

     cellActions.removeTarget(nil, action: nil, forControlEvents: .AllEvents) 

     if boolAlready { 
      cellActions.btnParticipate.setTitle("Annuler", forState: UIControlState.Normal) 
      cellActions.btnParticipate.addTarget(self, action: "deleteParticipation", forControlEvents: .TouchUpInside) 
     } else { 

      cellActions.btnParticipate.setTitle("...", forState: UIControlState.Normal) 
      cellActions.btnParticipate.addTarget(self, action: « deleteParticion", forControlEvents: .TouchUpInside) 
     } 
+0

Я уже пробовал в обоих направлениях, и он принимает то же самое время. –

Смежные вопросы