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

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

Выходной файл detailText из TableViewController в UILabel недействителен. Выходы не могут быть подключены к повторному контенту.

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

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

Чтобы устранить эту проблему, вам необходимо подключить метку прототипа к объекту 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. Статические клетки

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

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

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

Ответ 4

У меня есть UIViewcontroller, и в нем у меня есть табличное представление с пользовательской ячейкой на нем. Я сопоставляю свою розетку UILabel в UItableviewcell с UIViewcontroller, после чего получил ошибку.

Ответ 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 
}