Проблема с исчезновением cell.accessoryType

Я установил пользовательский UITableViewCell из кода. В моей ячейке у меня есть «UITableViewCellAccessoryDisclosureIndicator». При выделении ячейки она становится синей, а аксессуар становится белым. Так что все хорошо.

Однако при нажатии и нажатии нового вида аксессуар исчезает. Когда я возвращаюсь к просмотру таблицы, UITableViewCellAccessoryDisclosureIndicator исчезает, и нажатие/удержание пальца на той же ячейке не будет выделять ее снова.

На прошлой неделе он работал нормально, но я просто не могу понять, что внезапно вызвало эту проблему. Я ничего не вижу, когда делаю «hg diff», поэтому надеялся, что кто-нибудь направит меня к возможному решению. Если вам нужен конкретный код, пожалуйста, дайте мне знать.

Я использовал пример кода быстрой прокрутки atebits и сделал много настроек с ним, но основы (и выделенный BOOL) остались прежними.

PS. В моем коде я также заметил, что UITableViewCell не остается выделенным при нажатии нового представления. Я заметил, что в собственном примерном коде Apple ячейка выделяется при нажатии нового представления и, возвращаясь к табличному представлению, ячейка остается выделенной до тех пор, пока табличное представление не будет полностью возвращено на место. Любые идеи здесь? Спасибо.


person runmad    schedule 13.07.2009    source источник


Ответы (3)


Я ТОЛЬКО решил эту проблему для себя (этого утра)

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

person Dutchie432    schedule 13.07.2009

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

  1. Получить событие касания в ячейке табличного представления
  2. Ячейка выбирает (выделено синим цветом)
  3. Нажмите новый контроллер
  4. Любые действия на новом контроллере
  5. Вставьте новый контроллер
  6. Ячейка отменяет выбор (меняет цвет с синего на белый)

Если у вас этого не происходит, вы, вероятно, вызываете метод UITableView deselectRowAtIndexPath:animated: — это метод, отвечающий за программную отмену выбора ячеек в табличном представлении. Убедитесь, что в вашем коде нет дополнительных вызовов этого метода.

Что касается потери индикатора раскрытия, убедитесь, что источник данных вашего табличного представления не меняется во время нажатия или выталкивания контроллера представления. Если источник данных изменяется на другой объект, который не включает UITableViewCellAccessoryDisclosureIndicator в свои сгенерированные ячейки, вы не увидите его при обновлении таблицы путем нажатия или извлечения представления, даже если эта ячейка выделена. (Возможно, с диагностической точки зрения будет полезно отобразить таблицу, немного подождать, затем вызвать [tableView reloadData] и посмотреть, исчезнут ли дополнительные индикаторы.)

person Tim    schedule 13.07.2009
comment
Я добавил: - (void)viewWillAppear:(BOOL)animated { NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow]; если (selectedRowIndexPath != nil) { [self.tableView deselectRowAtIndexPath: selectedRowIndexPath анимированный: ДА]; } } Теперь с DisclosureIndicator все в порядке. Он возвращается, когда ячейка отменена или табличное представление нажато. Тем не менее, строка по-прежнему не выбрана, поскольку новое представление выдвигается. Я хотел бы получить эффект того, какая ячейка была посещена, чтобы ячейка оставалась выделенной. Кроме того, при нажатии на представление элемент раскрытия исчезает во время анимации :( - person runmad; 13.07.2009
comment
Я не уверен, что вы действительно должны добавлять вызовы deselectRowAtIndexPath:animated:, но вместо этого хотите удалить их - вы уже где-нибудь вызывали этот метод? Если нет, можем ли мы увидеть соответствующий код из вашего приложения (например, ваши реализации для tableView:didSelectRowAtIndexPath: и других методов делегата, имеющих отношение к навигации)? - person Tim; 14.07.2009

Если вы переопределяете «layoutSubviews», вам нужно позвонить

[super layoutSubviews];

перед вашим пользовательским макетом.

person Björn    schedule 05.06.2014