it-swarm.com.ru

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

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

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

Вот ошибка:

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

Любой способ обойти эту проблему, или есть ли способ, которым я могу передать представление от моего viewcontroller в эту ячейку tableview и ограничить ли это конфигурацией, которую я установил в Раскадровках? Спасибо!

22
Rob

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

Шаг 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];
}
18
Igor

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

0
Dima Deplov

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

enter image description here

0
thatzprem