Подтвердить что ты не робот

Просмотр контейнера iOS в UITableViewCell

Я пытаюсь добавить еще один контроллер представления внутри ячейки UITableView. Идея заключается в том, что вы нажимаете на ячейку, и она расширяется, чтобы показать больше контента - интерфейс обмена сообщениями. Это важно (я думаю), что это контролируется отдельным диспетчером обмена сообщениями.

Расширение ячейки и просмотр в ячейке расширения с соответствующими ограничениями на самом деле очень прямолинейно в раскадровки, поэтому я попытался сохранить все в раскадровки, добавив свой новый VC в TableViewCell через контейнер. Таким образом, я мог бы добавить ограничения в представление контейнера и передать содержимое из моего сообщения VC.

Здесь ошибка:

Нелегальная конфигурация. Контейнерные представления не могут быть помещены в элементы, которые повторяются во время выполнения.

Как обойти эту проблему, или есть способ, с помощью которого я могу подключить представление из моего диспетчера взглядов к этой таблице viewview и ограничить конфигурацию, которую я установил в Storyboards? Спасибо!

4b9b3361

Ответ 1

У меня была та же задача, и я решил ее так:

Шаг 1. Создайте подкласс MyCell: UITableViewCell.

Шаг 2. Если вы используете Self-Sizing Cells с саморазмером, в InterfaceBuilder добавьте UIView в MyCell, затем добавьте ограничение по высоте и ограничения со всех сторон. Этот вид необходим для установки высоты ячейки.
Если нет, пропустите этот шаг и используйте heightForRowAtIndexPath.

enter image description here enter image description here

Шаг 3. В MyCell.h добавьте выход из ограничения высоты представления и свойство контроллера:

@interface MyCell: UITableViewCell

@property (weak, nonatomic) MessagingVC *controller;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight;

@end

Шаг 4. В cellForRowAtIndexPath добавьте код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];

    // adjust this for your structure 
    cell.controller = [[UIStoryboard storyboardWithName:@"MessagingVC" bundle:nil] instantiateInitialViewController];

    [self addChildViewController:cell.controller];
    [cell.contentView addSubview:cell.controller.view];
    [cell.controller didMoveToParentViewController:self];

    //  if you use Self-Sizing Cells
    cell.viewHeight.constant = 200; // set your constant or calculate it

    return cell;
}

Шаг 5. Добавьте метод didEndDisplayingCell:

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([cell isKindOfClass:[MessagingVC class]])
         [((MyCell*)cell).controller removeFromParentViewController];
}

Ответ 2

Сделайте свой UITableViewController контент как Static.

enter image description here

Ответ 3

Вы можете просто перетащить Container View в UITableVeiw в раскадровку. Например, вы можете перетащить его перед ячейкой прототипа, и вы увидите контроллер своего контейнера перед вашими ячейками прототипа. Кстати, вы можете перетащить любой элемент пользовательского интерфейса в представление таблицы. Я не уверен, как работать с автозапуском в представлении таблицы комбинаций + контейнер, возможно, вам нужно вручную вычислить/установить ограничения во время выполнения. Будет обновлен мой ответ, когда я найду правильное решение об автозапуске.

Ответ 4

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

Когда пользователь прикасается к ячейке, вы просто используете обычный сеанс для контроллера представления сообщений. Его презентация будет автоматической. Затем создайте и укажите обработчик animationController для обработки перехода, чтобы он выглядел так, как будто представление композиции композиции содержалось в ячейке представления таблицы.