У меня странная проблема: в моем представлении таблицы я хочу обновить одну ячейку, когда ее 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
, но я даже не уверен, что вы должны называть его в представлении, если вы пытаетесь обновить макет ячейки таблицы. Любая помощь будет оценена по достоинству.
Обычная «gotcha» заключается в том, что вы не называете 'reloadData' в основном потоке, и поэтому пользовательский интерфейс не обновляется. Вы можете убедиться, что это так, если вы установили точку останова в свой метод 'valueChanged' или' cellForRowAtIndexPath', а затем в отладчике проверьте, в каком потоке вы работаете (должен быть Thread 1, com.apple.main-thread). Надеюсь, что это ваша проблема тоже :) – pbodsk
@pbodsk Нет, основной поток определенно не проблема. Во-первых, я не запускаю какой-либо другой код в другом потоке, поэтому reloadData вызывается в основном потоке, как и весь другой код. Два, если это была проблема, пользовательский интерфейс все равно будет обновляться, только с небольшой задержкой (потому что сначала код запускается в основном потоке). Однако в моем случае пользовательский интерфейс вообще не обновляется. И, наконец, отладчик дал бы мне предупреждение, если бы я делал изменения макета в фоновом потоке, даже не устанавливая точку останова. Я вообще ничего не предупреждаю. –
ОК, я просто подумал, что стоит проверить, было ли это так: – pbodsk