2013-05-21 2 views
1

Я новичок в iOS и MonoTouch, и у меня есть довольно простая потребность - у меня есть два совершенно разных вида для отображения в одной и той же ячейке таблицы в зависимости от того, выбран ли он или нет. Когда вы загружаете приложение, я представляю список продуктов в пользовательском UITableView, причем все строки не выбраны, и каждая строка в основном просто показывает имена продуктов в ярлыке. Как только пользователь удаляет один из строк и выбирает его, я показываю совсем другое представление с большим количеством макета корзины покупок. Поскольку эти два представления настолько различны, они имеют совершенно разные размеры. Мне нужно, чтобы сама ячейка (или строка?) Увеличивалась и сокращалась в соответствии с естественной высотой того, что отображается в настоящее время.Resize TableCell on select/deselect

Я использую потомки UITableViewController, UITableViewSource и UITableViewCell для решения. То, что я делаю, это добавить обе версии в ContentView ячейки, а затем установить свойство Hidden по мере необходимости, когда ячейка/строка выбрана/отменена, чтобы отобразить правильный макет. Это хорошо работает. Я сейчас в демоверсии, поэтому я не слишком беспокоюсь об эффективности или отзывчивости, которые должны будут прийти позже.

Я знаю, что GetHeightForRow отвечает за определение размеров строк, но он вызывается только один раз, когда ячейка сначала отображается. Мне кажется, что мне нужно предупредить TableView о повторном опросе источника для нового размера при изменении представлений, но я не могу понять, как это сделать.

Я попытался (скорее, надеюсь), чтобы вызвать GetHeightForRow для повторного запуска вручную, используя Cell.SetNeedsLayout и Cell.SetNeedsDisplay, надеясь, что это заставит таблицу повторно запросить источник для новых измерений, но без радости.

Я потрудился с прямым подходом, пытаясь определить размер самого содержимого, но не казалось, что он ведет куда угодно. Мне кажется, что в таблице должно быть предложено запросить новый размер строки, но я открыт для любых предложений.

Неужели я не первый, кто попытается это сделать? Что мне не хватает?

ответ

2

Попробуйте вместо GetHeightForRow позвонить по телефону ReloadRows.

Вы можете иметь или не иметь, чтобы указать начала/конца обновления (это может быть просто для анимации, правда?)

tableView.BeginUpdates(); 
tableView.EndUpdates(); 
+0

Это был недостающий кусок, спасибо так много. Моя одна жалоба заключается в том, что после вызова перезагрузки выбранное состояние, похоже, потеряно; если моя ячейка была выбрана до перезагрузки, она больше не будет потом. Но это было легко исправить, и это также возможно, что проблема, которую я создал как-то. Во всяком случае, это меня гораздо ближе к конечной цели. – user2403744

+0

Рад, что это помогло. Скорее всего, он снова запустит GetCell - вам нужно сохранить состояние ячейки, чтобы перезагрузить статус галочки там. То же самое происходит, если вы прокручиваете отмеченный элемент с экрана и обратно. –