Предупреждение раскадровки: ячейки таблицы прототипов должны иметь идентификаторы повторного использования

123

Я получаю это предупреждение от раскадровки - ячейки таблицы прототипов должны иметь идентификаторы повторного использования.

Я переименовал идентификатор в инспекторе атрибутов, но, похоже, предупреждение не снято.

Какие-либо предложения?

K.Honda
источник
Вы либо заполнили неправильное поле, либо у вас более одного представления таблиц. Можете выложить скриншот инспектора атрибутов?
jrturton
3
Теперь все в порядке, приятель. Я нашел решение. Значение идентификатора должно быть таким же, как идентификатор повторного использования. :)
K.Honda
Вы установили идентификатор для каждой ячейки?
Mick MacCallum
Привет, Хонда! Не могли бы вы рассказать мне, что вы сделали, потому что я получаю ту же ошибку.
Варун Мехта
2
Я заметил, что иногда (в настоящее время используется последняя версия Xcode 5 Beta 5 (5B103i)) выделяются неправильные места ошибки / предупреждения в раскадровке. Поэтому, если вы нажмете на предупреждение, оно иногда будет показывать неправильное место, где подобное предупреждение уже могло быть исправлено. Я предлагаю вручную просмотреть любое из табличных представлений, которые есть в вашей раскадровке, и проверить, есть ли другие ячейки с отсутствующим идентификатором. Выше решил мою проблему с этим предупреждением. Спасибо @ K.Honda за вопрос, так как эта тема помогла мне понять, как решить проблему.
Justas

Ответы:

159

Чтобы отключить предупреждение, вы должны дать имя идентификатору ячейки:

введите описание изображения здесь

aleroot
источник
14
довелось мне. закрыть xcode - открыть его, а потом сменить идентификатор
Идан Маглед
7
Когда предупреждение остается, это означает, что где-то на вашей StoryBoard все еще есть ячейка без идентификатора
saimonx
Если у вас более 1 ячейки прототипа, вы должны дать им всем идентификатор, иначе просто установите число
равным
6
Мне пришлось удалить папку Derived Data (эквивалент перезагрузки Windows в Xcode) и перестроить, чтобы избавиться от этого ложного предупреждения.
Майкл Макгуайр,
Это сработало для меня: закройте Xcode, откройте / Users / username / Library / Developer / Xcode / DerivedData в Finder и удалите все его содержимое (а не саму папку DerivedData).
dldnh
18

Другой способ - установить для свойства Table View «Prototype Cells» нулевое значение в Attributes Inspector, если вы определяете ячейку с помощью .xib программно.

Установка ячеек прототипа в 0 в инспекторе атрибутов

bitsand
источник
9

Поскольку раскадровка на самом деле является XML-файлом, еще один трюк - открыть раскадровку в любом текстовом редакторе (не в Xcode!) И попытаться найти все узлы tableViewCell. Например, нажмите CMD + F , введите <tableViewCell contentMode="scaleToFill"и нажмите Enter. Вы, вероятно, обнаружите, что строки совпадают с этой:

<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="GenericCellID" id="kBr-Qn-Tki">

Обратите внимание на reuseIdentifier="GenericCellID"ключевое значение. Строки, которые вызывают предупреждение (без идентификаторов повторного использования), не будут иметь такого значения ключа. Посмотрите узлы выше в текстовом редакторе, и вы увидите tableViewControllerузел с именем класса, который нужно проверить в редакторе раскадровки Xcode и исправить, в соответствии с ответом aleroot.

Дмитрий Варавкин
источник
1
Фактически вы можете открыть свою раскадровку как код с помощью Xcode, нажав CTRL + щелкнув файл раскадровки Open As>>Source Code
NSTJ
4

Если ваше предупреждение Xcode по-прежнему не исчезает даже после того, как вы установили reuseIdentifier, попробуйте меню «Продукт -> Очистить». Это помогло мне, и после этого предупреждение больше не появлялось.

Марсель Вассмер
источник
2

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

Если вы уверены, что пометили все свои ячейки в Storyboard, перестройте проект - ваше предупреждение может исчезнуть (как и мое).

Sitric
источник
2

Приветствую: перезапуск XCode у меня сработал (но, вероятно, требовалось просто перестроить вручную).

Hannele
источник
1

Я получил это предупреждение для Xcode 7. Я работаю со Swift. Я не добавил контроллер навигации для контроллера начального представления. Когда я это сделал ... Я получил это предупреждение от StoryBoard. Что я сделал:

  1. Есть два сегмента
    1. из контроллера навигации в контроллер корневого представления и
    2. из контроллера Root View в исходный контроллер View.
  2. Выберите переход, соединяющий контроллер корневого представления с контроллером начального представления.
  3. Назовите идентификатор
  4. Выберите написанную часть контроллера "Prototype" -> там вы увидите идентификатор в качестве опции.
  5. Вставьте то же имя идентификатора, что и ранее.

Предупреждение идет .. если не чистить sdk :)

Mili
источник
1

Убедитесь, что вы устанавливаете для объекта идентификатор повторного использования , а не идентификатор восстановления. . Оба доступны через раскадровку, и их легко перепутать.

В XML-файле раскадровки вы хотите установить reuseIdentifier, а не restorationIdentifier.

pkamb
источник
0

Я заметил, что эта ошибка возникает, когда у вас есть несколько ячеек прототипа (в свойствах tableview) и не всем им присвоены идентификаторы повторного использования.

Tjalsma
источник
Я тоже это видел, есть ли способ назвать все ячейки сразу или есть другой способ удалить эти предупреждения?
CatsLoveJazz
1
Каждой ячейке Prototye необходимо собственное уникальное имя. Так что нет возможности сделать это автоматически
Винсент
0

Идентификатор - это имя, на которое вы ссылаетесь в вашем .m файле. Когда она не заполнена, ссылка на ячейку невозможна.

Винсент
источник
0

Это для установки идентификатора повторного использования программно

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath*)indexPath 
{
    static NSString *cellIdentifier = @"wot";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell)
        cell = [[UITableViewCell alloc] initWithStyle: someStyle reuseIdentifier: cellIdentifier];

    return cell;
}
Мукеш
источник