UITextView внутри UITableView - PullRequest
6 голосов
/ 14 мая 2011

Я знаю, что этот вопрос задавался ранее, хотя я не могу найти то, что хочу. У меня есть раздел в моем приложении, где у меня есть табличное представление с текстовым представлением внутри него. Я НЕ хочу иметь отдельные файлы .xib, .h и .m для ячейки таблицы. Табличное представление не должно уменьшаться или увеличиваться в зависимости от количества текста в текстовом представлении. Я не хочу, чтобы текстовое представление было редактируемым. Надеюсь, об этом не так уж много и просить, хотя сейчас я действительно застрял.

1 Ответ

24 голосов
/ 14 мая 2011

Чтобы сделать это, вам нужно будет вставить один в UITableViewCell. Но нет необходимости создавать пользовательские ячейки. Вот основная идея того, что вы хотите сделать:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        UITextView *comment = [[UITextView alloc] initWithFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, tableView.rowHeight)];
        comment.editable = NO;
        comment.delegate = self;
        [cell.contentView addSubview:comment];
        [comment release];
    }
    return cell;
}

Вам, конечно, нужно будет задать свой rowHeight, если вы не хотите стандартную высоту 44pt, которая идет с ячейкой. И если вам нужны реальные ячейки, вам нужно добавить свою собственную логику, чтобы только ячейка, которую вы хотите, представляла собой textView, но это основная идея. Остальное вы можете настроить по своему усмотрению. Надеюсь, это поможет

РЕДАКТИРОВАТЬ: чтобы обойти textView, чтобы добраться до вашей ячейки, есть два способа сделать это.

1) вы можете создать собственный класс textView и переписать прикосновения. Начать отправлять сообщение super:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
}

это отправит сенсорные события в его суперпредставление, которое будет вашим tableView. Учитывая, что вы не хотите создавать пользовательские UITableViewCells, я думаю, что вы, вероятно, тоже не хотите создавать пользовательский класс textView. Что приводит меня ко второму варианту.

2) при создании textView удалите comment.editable = NO;. Мы должны сохранить его доступным для редактирования, но исправим это в методе делегата.

В вашем коде вы захотите вставить метод делегата textView, и мы сделаем всю нашу работу оттуда:

РЕДАКТИРОВАТЬ: изменение этого кода для использования с UITableViewController

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
// this method is called every time you touch in the textView, provided it's editable;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:textView.superview.superview];
    // i know that looks a bit obscure, but calling superview the first time finds the contentView of your cell;
    //  calling it the second time returns the cell it's held in, which we can retrieve an index path from;

    // this is the edited part;
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    // this programmatically selects the cell you've called behind the textView;


    [self tableView:self.tableView didSelectRowAtIndexPath:indexPath];
    // this selects the cell under the textView;
    return NO;  // specifies you don't want to edit the textView;
}

Если это не то, что вы хотели, просто дайте мне знать, и мы разберемся с вами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...