Используя XCode 4.5 и iOS 6, я разрабатываю приложение с простым табличным представлением с настраиваемыми ячейками. Я делал это сто раз в iOS 5 и ниже, но по какой-то причине новая система autoLayout доставляет мне много проблем.
Я настраиваю табличное представление и ячейку прототипа в IB, добавляю подвиды и подключаю их как IBOutlets, затем настраиваю делегата и источник данных. Однако теперь всякий раз, когда извлекается первая ячейка cellForRowAtIndexPath
, я получаю следующую ошибку:
*** Ошибка утверждения в - [ShopCell layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
*** Завершение работы приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «Auto Layout все еще требуется после выполнения -layoutSubviews. Реализация ShopCell -layoutSubviews должна вызывать super.
Я не реализовал метод -layoutSubviews в своей подклассовой ячейке (ShopCell), и даже когда я пытаюсь это сделать и добавить супер-вызов, поскольку он предполагает, я все равно получаю ту же ошибку. Если я удалю подпредставления из ячейки в IB и изменю их на стандартный UITableViewCell, все будет работать так, как ожидалось, хотя, конечно, в моих ячейках не останется данных.
Я почти уверен, что мне не хватает чего-то простого, но я не могу найти никакой документации или руководств, чтобы предположить, что я сделал не так. Любая помощь будет оценена.
Изменить: просто попытался изменить его на UITableViewCell в IB и оставить все подпредставления на месте, все та же ошибка.
источник
lldb [[UIWindow keyWindow] _autoLayoutTrace]
Если используется автоматический макет, попробуйте в области отладчика.Ответы:
Я столкнулся с той же проблемой при добавлении ограничений в код вручную. В коде я делал следующее:
гипотеза
Насколько я могу судить, проблема в том, что при отключении
translatesAutoresizingMaskIntoConstraints
UITableViewCell начинает использовать Auto Layout и, естественно, дает сбой, потому что базовая реализацияlayoutSublayersForLayer
не вызывает super. Кто-то с Хоппером или другим инструментом может это подтвердить. Поскольку вы используете IB, вам, вероятно, интересно, почему это проблема ... и это потому, что использование IB автоматически отключаетtranslatesAutoresizingMaskIntoConstraints
представления, к которым он добавляет ограничения (вместо них автоматически добавляются ограничения ширины и высоты).Решение
Моим решением было переместить все в папку
contentView
.Я не уверен на 100%, будет ли это работать в Interface Builder, но если вы вытолкнете все из своей ячейки (при условии, что у вас есть что-то прямо на ней), это должно сработать. Надеюсь, это вам поможет!
источник
subview.translatesAutoresizingMaskIntoConstraints = NO'
в каждое подпредставление, которое я добавлял в contentView.self.contentView.translatesAutoresizingMaskIntoConstraints = NO
поддержкиUITableViewCell
.По-видимому, реализация layoutSubviews UITableViewCell не вызывает super, что является проблемой с автоматической компоновкой. Мне было бы интересно посмотреть, исправит ли что-то удаление приведенной ниже категории в проекты. Это помогло в тестовом проекте.
Я мог бы добавить, что проблема возникла у меня при использовании backgroundView в ячейке таблицы, так как это добавляется как subview к ячейке (тогда как большинство subviews следует добавить в contentView ячейки таблицы, что обычно должно работать лучше).
Примечание. Похоже, что эта ошибка исправлена в iOS7; Мне удалось удалить этот код или, по крайней мере, добавить проверку времени выполнения, чтобы она выполнялась только при работе на iOS6.
источник
UITableView
той же причине (iOS 6.1 b1)У меня была такая же ошибка несколько месяцев. Но я нашел, в чем проблема.
Когда я создаю файл IB,
UIView
он уже добавлен. Если вы используете это представление, приложение не вылетает при отключении автоматического макета (но есть и другие проблемы). При использовании автоматической компоновки, вы должны выбрать правильный вид в библиотеке объектов:UITableViewCell
.На самом деле, вы должны всегда использовать этот пункт , потому что все подвиды добавляют к
contentView
изUITableViewCell
.Вот и все. Все будет хорошо.
источник
У меня была
UITableViewHeaderFooterView
такая же проблема с custom + xib.Я видел здесь несколько ответов, но обнаружил, какая реализация
-layoutSubviews
в моем пользовательском классе представления нижнего колонтитула устраняет проблему:источник
Я видел это в результате изменения ограничений в моей реализации layoutSubviews. Перемещение вызова к super с начала до конца метода устранило проблему.
источник
Была такая же проблема в iOS 7 (iOS 8 вроде бы исправил). Решением для меня было вызвать
[self.view layoutIfNeeded]
в конце моегоviewDidLayoutSubviews
метода.источник
Я была такая же проблема. Проблема заключалась в том, как я создавал ячейку Xib. Я создал Xib, как обычно, и просто изменил тип «UIView» по умолчанию на свой собственный класс UITableViewCell. Правильный способ - сначала удалить представление по умолчанию, а затем перетащить объект ячейки табличного представления на xib. Подробнее здесь: http://allplayers.github.io/blog/2012/11/18/Custom-UITableViewCell-With-NIB/
источник
Я решил проблему, отключив «Автоформат» для всех подпредставлений моей пользовательской ячейки табличного представления.
В xib для настраиваемой ячейки выберите подпредставление и снимите флажок File Inspector> Interface Builder Document> Use Autolayout
источник
У меня была подобная проблема не на себе,
UITableViewCell
а скорее наUITableView
себе. Поскольку это первый результат в Google, я выложу его здесь. Оказалось, что этоviewForHeaderInSection
была проблема. Я создалUITableViewHeaderFooterView
и наборtranslatesAutoresizingMaskIntoConstraints
дляNO
. А теперь самое интересное:IOS 7:
Если я сделаю это, приложение вылетит с
Хорошо, я думал, вы не можете использовать автоматический макет в заголовке представления таблицы и только в подпредставлениях. Но это не вся правда, как вы увидите позже. Подводя итог: не отключайте маску автоматического изменения размера для заголовка на iOS 7. В противном случае все работает нормально.
iOS 8:
Если бы я не использовал это, я бы получил следующий результат:
Для iOS 8 необходимо отключить автоматическое изменение размера маски для заголовка.
Не знаю, почему это так, но похоже, что Apple исправила некоторые вещи в iOS 8, и автоматическая компоновка работает по-разному в iOS 7 и iOS 8.
источник
Как уже было сказано выше, когда вы создаете представление для использования в UITableView, вы должны удалить представление, созданное по умолчанию, и перетащить UITableViewCell или UITableViewHeaderFooterView в качестве корневого представления. Однако есть способ исправить XIB, если вы пропустили эту часть. Вы должны открыть файл XIB в текстовом редакторе и в корневом теге и его прямой потомок добавить / изменить атрибут
translatesAutoresizingMaskIntoConstraints
кYES
, например ,<view contentMode="scaleToFill" horizontalHuggingPriority="1000" id="1" translatesAutoresizingMaskIntoConstraints="YES" customClass="MXWCollapsibleTableHeaderView">
источник
Я сталкиваюсь с этим, и кажется, что это связано с подклассами UITableViewCell как с ячейками прототипа, в которые специально добавлены другие настраиваемые подклассы UIView. Я подчеркиваю здесь «обычай», потому что я добился успеха с ячейками, у которых есть только дочерние элементы UIKit, но он падает при попытке создать ограничения для представлений, которые я создал на заказ, что приводит к ошибке, указанной в вопросе авторов.
Мне пришлось разделить свои ячейки на независимые перья, которые не используют AutoLayout.
Будем надеяться, что Apple уберет этот беспорядок.
источник
Добавьте свои подпредставления в contentView ячейки вместо самой ячейки. Так что вместо:
[self addSubview:someView];
вы должны использовать
[self.contentView addSubview:someView];
источник
Я столкнулся с этим, потому что изначально я добавил UIView вместо UITableViewCell в файл xib.
источник
Я устранил эту ошибку, отсоединив
backgroundView
коннектор от фона,UIImageView
аaccessoryView
коннектор - отUIButton
настроек. Я подозреваю, что они не предназначались для использования так, как я их использовал.источник
Сегодня я впервые столкнулся с этой проблемой. До сих пор у меня был некоторый опыт использования прототипов подклассов UITableViewCell, но я никогда не сталкивался с этой проблемой. Что отличало ячейку, с которой я работал, так это то, что у меня был IBOutlet для -backgroundView, который я использовал для раскрашивания ячейки. Я обнаружил, что если я создал новое свойство и все же добавил новый UIView, который растягивал всю ячейку, это утверждение исчезло. Чтобы убедиться, что это была причина, я вернулся к прикреплению этого представления к выходу backgroundView, и утверждение снова появилось. Пока нет других проблем с использованием AutoLayout в подклассе прототипа UITableViewCell, поскольку я внес это изменение.
источник
У меня не было подходящего решения для этой проблемы, но вы можете исправить это, используя фреймы и не устанавливая для свойства translatesAutoresizingMaskIntoConstraints значение Нет (по умолчанию это да, поэтому не устанавливайте его)
источник
Я испытал то же самое. Оказалось, что если вы программно добавляете подпредставление из вашего ShopCell .xib / раскадровки, которое использует автоматический макет в качестве подпредставления для другого представления, это исключение может быть сгенерировано, в зависимости от того, как настроены ваши ограничения. Я предполагаю, что ограничения, созданные в IB, - это то, что создает проблемы при программном добавлении представления в качестве подпредставления, поскольку оно затем поддерживает ограничения из viewA -> viewB, в то время как вы можете добавить viewB как подвид viewC. Вы поняли (это предложение даже меня сбивает с толку)?
В моей ситуации - поскольку проблема была вызвана очень простыми представлениями - я создавал представления программно, а не в IB. Это решило ее. Вы можете извлечь эти представления в другие файлы xib и отключить для них автоматическую компоновку. Я думаю, это сработает.
источник
В некоторых ситуациях это легко решает проблему макета (в зависимости от вашего макета). Внутри подкласса UITableView, либо в awakeFromNib, либо в init, установите маску автоматического изменения размера:
По умолчанию установлено значение UIViewAutoresizingNone
источник
[tableViewCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height
получением высоты, которую затем используюheightForRowAtIndexPath
.В моем случае,
Указанный UIImageView для автоматического макета для UITableView назначается backgroundView UITableView.
Итак, я удалил UIImageView для backgroundView из UIView (корневое представление) и сбросил (удалил) все ссылки автоматического макета на этот UIImageView. Я разместил этот UIImageView для фона снаружи от UIView (корневого представления). А затем назначьте backgroundView UITableView в коде.
Потом исправил.
источник
Я нашел решение.
В моем случае я создал представление ячейки в раскадровке (с включенной автоматической компоновкой) и определил пользовательский интерфейс UITableViewCell в моем ViewController.m, мне нужно переместить интерфейс в ViewController.h.
источник
Я столкнулся с той же проблемой, когда использую раскадровку для создания пользовательского UITableViewCell. К счастью, я нашел проблему, потому что я выводил accessoryView ([UITableViewCell setAccessoryView:]) в UIButton, который я добавил в ячейку.
Решение
Предложение
источник
Эта проблема может быть вызвана тем, что вы забыли позвонить
[super viewDidAppear:]
внутрьviewDidAppear
, но я уверен, что это не единственная причина.источник
У меня была точно такая же проблема. Вот проблема с моим проектом:
Когда я работал на Interface Builder для создания пользовательских UITableViewCell, я перетащил View вместо Table View Cell из панели коллекции объекта в Xcode
как ячейки пользовательских таблиц.
Если вы находитесь в такой же ситуации, вот решение:
удалите представление в построителе интерфейса, убедитесь, что вы перетащили ячейку табличного представления из панели коллекции объектов и повторите создание настраиваемого представления ячейки таблицы. Вы можете скопировать объекты в старом представлении и вставить их на холст для новой ячейки табличного представления.
источник
У меня была очень похожая проблема с представлением нижнего колонтитула таблицы, которое я устанавливал в Xcode 6, iOS 7+. Решение было в формате файла пера. Очевидно, он застрял в формате Xcode 4 или что-то в этом роде. Изменение настроек файла на «открывается в: Xcode 6.0» (или по умолчанию, если на то пошло) мгновенно исправило это. Решение нашел случайно: это сводило меня с ума, поэтому я удалил весь файл и создал заново, очевидно, с настройками по умолчанию. Я понятия не имею, почему простое редактирование файла в последней версии Xcode не преобразовало его в формат Xcode 5+, как это обычно бывает.
источник
У меня была такая же проблема. Я зашел в свой DetailViewController и переименовал идентификатор в UIView. Ранее он был на UITableView. Это устранило проблему. Эта проблема не обязательно должна быть в вашем DetailViewController. Может быть в любом другом. Попробуйте переименовать его в уважаемый идентификатор.
источник
У меня была аналогичная проблема со статическими ячейками табличного представления в IB. В одной из ячеек было вложенное представление, в котором был класс, ошибочно измененный на подкласс UITextfield. Никаких предупреждений / ошибок компилятор не выдавал. Но во время выполнения система не смогла загрузить контроллер представления из-за вышеупомянутого сбоя.
источник
Проблема заключается в последовательности вызовов макета для подпредставлений:
Проверять, выписываться
Появляется в iOS <8
источник
Решение: изменить ограничения перед вызовом супер-макета
источник
Я изменил ответ Карла Линдберга, чтобы переопределить
UITableView
его, и он начал работать для меня:UITableView + AutoLayoutFix.h
UITableView + AutoLayoutFix.m
Затем
MyViewController.m
я просто импортировал категорию:источник
Я столкнулся с той же проблемой и, наконец, обнаружил, что причина в том, что я добавил одно ограничение к UITableViewCell, которым должен быть contentView UITableViewCell . Когда я изменил ограничение, все прошло нормально!
источник