it-swarm.com.ru

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

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

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

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

129
Tomblasta

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

155
Wain

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

 enter image description here

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

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

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

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

 enter image description here

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

 enter image description here

Наконец, в вашем методе 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. Статические ячейки

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

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

 enter image description here

43
Fangming

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

20
Justin Domnitz

Или вам не нужно использовать IBOutlet для ссылки на объект в представлении. Вы можете задать метку в значении тега tableViewCell a, например, установите для тега значение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 
}
4
SLN

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

1
lee

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

0
Nikhil Muskur