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


144

Я тільки що створив додаток і почав підключати @ IBOutlet's до розкадрівки. Я підключаю деякі з них до міток у комірці прототипу UITableViewCell з базовим стилем. Коли я підключаю його, хоча отримую цю помилку на Дошці розкадрувань:

Розетка DetailsText з 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об'єкта. А 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 місяців.
ttorbik

Дякую, моя проблема полягає в тому, що я підключаю його до ViewController, а не до комірки.
Стелла

23

Якщо ви використовуєте подання таблиці для відображення параметрів та інших параметрів (як це вбудований додаток "Налаштування"), то ви можете встановити вміст перегляду таблиці на статичні клітинки за допомогою Інспектора атрибутів . Також для цього потрібно вбудувати свій Табличний вигляд у екземпляр UITableViewController.


Це набагато простіше і швидше, і це має бути прийнята відповідь imho
Хайме Агудо

5

Або вам не потрібно використовувати IBOutlet для позначення об'єкта у вікні перегляду. Ви можете надати мітці в таблиціViewCell значення тега, наприклад встановити тег на 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 у своєму користувацькому класі
Shauket Sheikh

0

Як більшість людей зазначили, що підкласифікація UITableViewCell вирішує це питання. Але причина цього заборонена, оскільки комірка прототипу ( UITableViewCell ) визначена Apple, і ви не можете додати до неї жодну власну розетку .


0

Іноді Xcode не міг контролювати правильне підключення до розетки стільника.

Якось мітка / кнопка моєї поточної комірки з'єднала іншу клітинку, я просто видаляю їх, і помилка усувається.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.