Розетки не могут быть подключены к повторяющемуся контенту iOS


144

Я только что создал приложение и начал подключать @ IBOutlet к раскадровке. Я подключаю некоторые из них к меткам в ячейке прототипа UITableViewCell с базовым стилем. Когда я подключаю его, я получаю эту ошибку в раскадровке:

Вывод detailText из TableViewController в UILabel недопустим. Розетки не могут быть связаны с повторяющимся контентом.

Кто-нибудь может мне помочь? Я настроил его так, как я всегда делаю успешно, но на этот раз он забросил меня на эту ошибку.


54
Вы не можете подключить метку в ячейке прототипа к IBOutlet в подклассе UIViewController - вы должны подключить ее к IBOutlet в подклассе UITableviewCell.
Paulw11

Хорошо, спасибо! :) Так что я просто понимаю: вы можете объяснить, почему?
Томбласта

3
Поскольку у вас может быть любое количество ячеек и только один контроллер представления - так, какая метка ячейки должна быть связана с контроллерами представления IBOutlet?
Paulw11

Итак, почему вы не можете просто использовать cellForRowAtIndexPath для текста ячейки в одном контроллере представления? Спасибо!
Томбласта

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

Ответы:


168

Создайте подкласс ячейки табличного представления и установите его как класс прототипа. Добавьте розетки к этому классу и соедините их. Теперь при настройке ячейки вы можете получить доступ к розеткам.


9
@Wain, не могли бы вы добавить больше информации о доступе к этим магазинам?
Хуан Боэро

1
Хуан Пабло - он говорит, что это нормально использовать ячейку с табличным представлением. Вы не можете установить выход для ограничения внутри представления, где вы используете ячейку, вместо этого вам нужно сделать это, например, в cellForRowAtIndexPath - customCell.constraint_row_width.constant = 25.0;
Стюарт П.

70

Существует два типа ячеек табличных представлений, предоставляемых вам через раскадровку: динамические прототипы и статические ячейки.

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

1. Динамические прототипы

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

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

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

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

Чтобы решить эту проблему, вам нужно подключить вашу метку прототипа к UITableViewCellобъекту. A UITableViewCellтакже является прототипом ячеек, и вы можете инициировать столько объектов ячеек, сколько хотите, каждый из которых затем подключается к представлению, сгенерированному из вашего прототипа ячейки таблицы раскадровки.

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

Наконец, в вашем cellForRowметоде создайте пользовательскую ячейку из UITableViewCellкласса и делайте забавные вещи с меткой

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. Статические ячейки

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

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

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


@FangmingNing в моем коде, я все еще не могу изменить текстовую метку, я подключил класс к ячейке, назвал правильную ячейку с идентификатором, но все еще не меняется
jorge saraiva

@jorgesaraiva Давайте обсудим это в чате. chat.stackoverflow.com/rooms/159396/discuss
Fangming

Мне не хватало как! YourCell . +100
Даниэль Спрингер

Всегда приятно немного освежиться после работы над проектом всего за 6 месяцев.
вторник

Спасибо, моя проблема в том, что я подключаю его к ViewController, а не к ячейке.
Стелла

23

Если вы используете вид таблицы для настройки отображения и других параметров (например , встроенные в настройках приложение делает), то вы можете установить Table View Content для статических ячеек под атрибутами инспектора . Кроме того, для этого необходимо встроить табличное представление в экземпляр UITableViewController.


Это намного проще и быстрее, и им должен быть принят ответ imho
Хайме Агудо

5

Или вам не нужно использовать IBOutlet для ссылки на объект в представлении. Вы можете присвоить метке в tableViewCell значение тега, например, установите для тега значение 123 (это может сделать инспектор атрибутов). Тогда вы можете получить доступ к ярлыку по

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}

очень легко и просто! +100
Джулиан Сильвестри

1

Со мной у меня есть UIViewcontroller, и в нем у меня есть таблица с пользовательской ячейкой на нем. Я сопоставляю свою точку выхода UILabel UItableviewcellс UIViewControllerполученной ошибкой.


создать собственный класс ячейки и создать экземпляр iboutlet в этом пользовательском классе
Шаукет Шейх

0

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


0

Иногда XCode не может правильно контролировать подключение к ячейке.

Каким-то образом метка / кнопка моей текущей ячейки соединилась с другой, я просто удаляю их, и ошибка исчезает.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.