добавление подпредставлений в представление содержимого UITableViewCell делает ячейку невыбираемой - PullRequest
1 голос
/ 25 ноября 2011

Я хочу добавить статический текст в 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.

Ответы [ 4 ]

2 голосов
/ 09 января 2012

Я думаю, что несколько лучший способ сделать это - создать распознаватель жестов касания на всей таблице.(Например, в вашем 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.

1 голос
/ 25 ноября 2011

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

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

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

1 голос
/ 25 ноября 2011

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

  • Объявить ваш класс контроллера (я полагаю, UITableViewController?) Как делегат UITexView.
  • Когда вы объявляете свой UITextView, установите контроллер табличного представления в качестве его делегата.
  • Реализуйте один из методов UITextViewDelegate (например: - (void) textViewDidChangeSelection: (UITextView *) textView) в вашем контроллере табличного представления.m файл.
  • Из этого метода вы можете манипулировать целевой ячейкой либо с помощью пользовательского кода, либо с помощью триггера tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) делегировать метод через selectRowAtIndexPath: animated: 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 или по крайней мере сослаться на него как на переменную экземпляра класса контроллера табличного представления.Это поможет вам легко отслеживать, какой адрес addressField был получен, и получить правильный indexPath.

1 голос
/ 25 ноября 2011
[addressField setUserInteractionEnabled:NO];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...