добавление subviews в представление контента UITableViewCell делает ячейку невыбираемой

Я хочу добавить некоторый статический текст в UITableViewCell в UITextView.

UITextView *addressField = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 300, 75)]; [addressField setBackgroundColor:[UIColor clearColor]]; [addressField setFont:[UIFont fontWithName:@"HelveticaNeue" size:14]]; [addressField setContentInset:UIEdgeInsetsMake(0, 20, 0, 0)]; [addressField setEditable:NO]; [addressField setScrollEnabled:NO]; // change me later [addressField setText:@"John Doe\n555 Some Street\nSan Francisco, CA, 00000"]; [cell.contentView addSubview:addressField]; [addressField release]; 

Это отлично работает, но я этот код делает ячейку невыбираемой, вероятно, потому, что UITextView покрывает всю ячейку.

Как я могу обойти это, чтобы у меня были как UITextView, так и выбираемые ячейки?

Кстати, я мог бы сделать размер UITextView немного меньше, но пользователи все равно не смогут выбрать ячейку, если касаются UITextView.

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

  • Объявите свой класс контроллера (UITableViewController, я думаю?) Как делегат UITexView.
  • Когда вы объявляете свой UITextView, установите контроллер представления таблицы как делегат.
  • Внесите один из методов UITextViewDelegate (ex: – (void) textViewDidChangeSelection: (UITextView *) textView) в файл .m-файла.
  • Из этого метода вы можете манипулировать целевой ячейкой либо с помощью специального кода, либо путем запуска метода tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) с помощью selectRowAtIndexPath: анимированный: scrollPosition :.

Тогда ваш код может выглядеть так:

В файле табличного представления .h файл:

 @interface MyTableViewController : UITableViewController <UITextViewDelegate> { ... ... } 

В файле табличного представления .m-файла:

 UITextView *addressField = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 300, 75)]; [addressField setDelegate:self]; ... 

Затем выполните эту функцию, например (или любую другую подходящую функцию UITextViewDelegate):

 - (void)textViewDidChangeSelection:(UITextView *)textView { // Determine which text view triggered this method in order to target the right cell ... // You should have obtained an indexPath here ... // Call the following function to trigger the row selection table view delegate method [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone] } 

Обратите внимание, что есть и другие альтернативы, такие как подклассификация UITextView и обработка его сенсорных методов. Однако я бы рекомендовал использовать возможности, предлагаемые его протоколом делегирования.

Также обратите внимание, что было бы удобно, чтобы ваш UITextView был объявлен или, по крайней мере, указан как переменная экземпляра класса контроллера табличного представления. Это поможет вам легко отслеживать, на какой адресField попал и получить нужную indexPath.

Я думаю, что немного лучший способ сделать это – создать признак распознавания жесткого диска на всей таблице. (Например, в вашем viewDidLoad)

 // gesture recognizer to make the entire cell a touch target UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(changeFocus:)]; [tableView addGestureRecognizer:tap]; [tap release]; 

Затем вы создаете селектор (changeFocus: в этом случае), чтобы выполнить фактический выбор.

 - (void)changeFocus:(UITapGestureRecognizer *)tap { if (tap.state == UIGestureRecognizerStateEnded) { CGPoint tapLocation = [tap locationInView:self.tableView]; NSIndexPath* path = [self.tableView indexPathForRowAtPoint:tapLocation]; [self tableView:self.tableView didSelectRowAtIndexPath:path]; } } 

Вы можете сделать свой метод changeFocus более сложным, чтобы предотвратить выбор или сосредоточиться на определенных подсмотрах выбранного indexPath.

 [addressField setUserInteractionEnabled:NO]; 

Надеюсь, это поможет вам немного:

 [self.view insertSubview:TextView aboveSubview:TableView]; 

Или наоборот, исходя из ваших требований.

  • Как получить данные из первой ячейки в UITableView?
  • Сгруппированный UITableView с fetchedResultsController
  • Отображать изображение, когда UITableView пуст
  • Хотите расширить и свернуть раздел UITableview
  • Шрифт HeadView / Footer TableView в сгруппированном столе (Swift)
  • Могу ли я контролировать порядок загрузки компонентов SplitView?
  • как проверить, что UITableViewCell не ноль (инициализирован) внутри heightForRowAtIndexPath?
  • Прокрутка UITableView не позволяет прокручивать
  • NSMutableArray получает : непризнанный селектор, отправленный в экземпляр
  • Сохраняйте «пользовательские» фотографии в подробном представлении и загружайте его при нажатии в виде таблицы
  • UIProgressview в подклассе UITableViewCell необходимо использовать в другом UIViewController
  • Interesting Posts

    iOS autolayout – разрыв между изображением и верхней частью экрана, несмотря на установленные ограничения

    Как планировать UILocalNotification в каждый день или каждый третий день?

    Извлечение заголовка MKnnotation Callout при отправителе

    Разница между простым кодом, конструктором интерфейса и раскадрой

    Ошибка «Предоставление профиля не совпадает с ошибкой разработчика» при настройке GreenhouseCI

    UITabbar Изображения и название не выравниваются по центру в ipad

    Отдельные медиа-запросы iOS

    Как получить календарные события по дате?

    На iPad, как я могу заставить встроенный звук на моей веб-странице перестать играть, когда браузер закрыт?

    Бесконечная сессия с facebook ios sdk FBLoginView

    Понимание использования временного объекта

    Как я могу перейти на страницу запуска приложений в ios

    Интеграция QuickBlox в iOS

    NSRunLoop runMode: beforeDate: не ждет

    Как использовать справочную систему с какао-стручками?

    Давайте будем гением компьютера.