2016-10-25 9 views
0

У меня странная проблема: в моем представлении таблицы я хочу обновить одну ячейку, когда ее UISlider будет изменен (значение изменено событие управления). В настоящий момент значение ползунка изменяется, я хочу анимировать кнопку в ячейке (скользящую справа). Я установил константу ограничения кнопки на -50, чтобы убедиться, что она не видна по умолчанию, и когда значение ползунка изменяется, вызывается метод, который обновляет представление таблицы, поэтому cellForRowAtIndexPath снова вызывается для всех ячеек в моей таблице. Упрощенное это выглядит примерно так:Изменения константы константы, но макет не обновляется?

func valueChanged(sender:UISlider) { 
    // Reload table view 
    self.myTableView.reloadData() 

    // Let table view know the value of the slider got modified 
    self.didChangeValueOfSlider = true 
} 

И cellForRowAtIndexPath я отслеживание какой ячейка слайдера был изменено с помощью переменного пользовательского selectedCellIndexPath. Когда табличные попадет в клетку, который получил модифицированную: он запускает следующий код:

// Check if cell is selected 
    if indexPath == self.selectedCellIndexPath { 

     // Check if value of slider was changed 
     if self.didChangeValueOfSlider == true { 

      // Value was changed: set constraint back to default 
      saveButtonTrailingConstraint.constant = CGFloat(15) 
      self.view.setNeedsUpdateConstraints() 
      self.view.updateConstraintsIfNeeded() 

      // Reset slider update status 
      self.didChangeValueOfSlider = false 
     } 
    } 

Calling тех setNeedsUpdateConstraints() и updateConstraintsIfNeeded() может быть излишними или ненужными, но обратите внимание, что это моя пятнадцатую попытка или так, чтобы фактически получить чтобы отобразить обновленный макет. Я использовал точки останова, чтобы подтвердить, что константа действительно изменяется, после того, как код выше завершен, и все работает отлично. Единственное, что я не могу получить, это часть обновления. Я пробовал UIView.animateWithDuration, чтобы анимировать изменение, и я пробовал такие методы, как layoutIfNeeded() и beginUpdates() и endUpdates вид таблицы: ничего не работает. Что может быть причиной того, что макет не обновляется? И что я должен называть методами layout и update? Я вызываю их на self.view, но я даже не уверен, что вы должны называть его в представлении, если вы пытаетесь обновить макет ячейки таблицы. Любая помощь будет оценена по достоинству.

+0

Обычная «gotcha» заключается в том, что вы не называете 'reloadData' в основном потоке, и поэтому пользовательский интерфейс не обновляется. Вы можете убедиться, что это так, если вы установили точку останова в свой метод 'valueChanged' или' cellForRowAtIndexPath', а затем в отладчике проверьте, в каком потоке вы работаете (должен быть Thread 1, com.apple.main-thread). Надеюсь, что это ваша проблема тоже :) – pbodsk

+0

@pbodsk Нет, основной поток определенно не проблема. Во-первых, я не запускаю какой-либо другой код в другом потоке, поэтому reloadData вызывается в основном потоке, как и весь другой код. Два, если это была проблема, пользовательский интерфейс все равно будет обновляться, только с небольшой задержкой (потому что сначала код запускается в основном потоке). Однако в моем случае пользовательский интерфейс вообще не обновляется. И, наконец, отладчик дал бы мне предупреждение, если бы я делал изменения макета в фоновом потоке, даже не устанавливая точку останова. Я вообще ничего не предупреждаю. –

+0

ОК, я просто подумал, что стоит проверить, было ли это так: – pbodsk

ответ

0

Я понял. Проблема оказалась самим ограничением. поскольку я обращался к неверному. Я определил его как saveButtonTrailingConstraint, но на самом деле я изменял ограничение ширины saveButton (что, по-видимому, не может быть анимировано). Вместо доступа к saveButton.constraints[indexOfTrailingConstraint] я должен был определить saveButton.superview!.constraints[indexOfTrailingConstraint], поскольку ограничение принадлежит супервизу, а не самой кнопке. Я думаю, лучшее, что можно отнять от этой неуклюжей ошибки, - это всегда дважды проверять, изменяете ли вы правильное ограничение, если вы делаете это программно, потому что это не всегда отображается в первом глазу.

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

  • Нет связанных вопросов^_^