Просмотр контейнера iOS в UITableViewCell
Я пытаюсь добавить еще один контроллер представления внутри ячейки UITableView. Идея заключается в том, что вы нажимаете на ячейку, и она расширяется, чтобы показать больше контента - интерфейс обмена сообщениями. Это важно (я думаю), что это контролируется отдельным диспетчером обмена сообщениями.
Расширение ячейки и просмотр в ячейке расширения с соответствующими ограничениями на самом деле очень прямолинейно в раскадровки, поэтому я попытался сохранить все в раскадровки, добавив свой новый VC в TableViewCell через контейнер. Таким образом, я мог бы добавить ограничения в представление контейнера и передать содержимое из моего сообщения VC.
Здесь ошибка:
Нелегальная конфигурация. Контейнерные представления не могут быть помещены в элементы, которые повторяются во время выполнения.
Как обойти эту проблему, или есть способ, с помощью которого я могу подключить представление из моего диспетчера взглядов к этой таблице viewview и ограничить конфигурацию, которую я установил в Storyboards? Спасибо!
Ответы
Ответ 1
У меня была та же задача, и я решил ее так:
Шаг 1. Создайте подкласс MyCell: UITableViewCell
.
Шаг 2. Если вы используете Self-Sizing Cells
с саморазмером, в InterfaceBuilder добавьте UIView в MyCell, затем добавьте ограничение по высоте и ограничения со всех сторон. Этот вид необходим для установки высоты ячейки.
Если нет, пропустите этот шаг и используйте heightForRowAtIndexPath
.
![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 для обработки перехода, чтобы он выглядел так, как будто представление композиции композиции содержалось в ячейке представления таблицы.