Los puntos de venta no se pueden conectar a contenido repetido iOS

144

Acabo de crear una aplicación y comencé a conectar @ IBOutlet al guión gráfico. Estoy conectando algunos de ellos a etiquetas en una celda prototipo UITableViewCell con un estilo básico. Cuando lo conecto, aparece este error en el Guión gráfico:

El Outlet detailText del TableViewController al UILabel no es válido. Los puntos de venta no se pueden conectar a contenido repetido.

¿Alguien me puede ayudar? Lo configuré como siempre lo hago con éxito, pero esta vez me arrojó este error.

Tomblasta
fuente
54
No puede conectar una etiqueta en una celda prototipo a un IBOutlet en una subclase UIViewController; debe conectarlo a un IBOutlet en una subclase UITableviewCell.
Paulw11
¡OK gracias! :) Así que solo entiendo: ¿puedes explicar por qué?
Tomblasta
3
Debido a que puede tener cualquier cantidad de celdas y solo un controlador de vista único, entonces, ¿qué etiqueta de celda debe conectarse al IBOutlet de los controladores de vista?
Paulw11
Ok, entonces ¿por qué no podrías simplemente usar cellForRowAtIndexPath para el texto de la celda en un solo controlador de vista? ¡Gracias!
Tomblasta
3
Debido a que las salidas están unidas a objetos (como etiquetas) cuando se carga el controlador de vista: en ese punto no hay celdas, por lo que no hay etiquetas para unir, y si hubo celdas, ¿cuál desea vincular
Paulw11

Respuestas:

168

Cree una subclase de celda de vista de tabla y configúrela como la clase del prototipo. Agregue los enchufes a esa clase y conéctelos. Ahora, cuando configura la celda, puede acceder a las salidas.

Wain
fuente
9
@Wain, ¿podría agregar más información sobre cómo acceder a esos puntos de venta?
Juan Boero
1
Juan Pablo: lo que dice es que es normal usar una celda de vista de tabla personalizada. No puede establecer la salida para una restricción dentro de la vista donde está usando la celda, en su lugar, debería hacerlo en cellForRowAtIndexPath, por ejemplo: customCell.constraint_row_width.constant = 25.0;
Stuart P.
70

Hay dos tipos de celdas de vistas de tabla que se le proporcionan a través del guión gráfico: son prototipos dinámicos y celdas estáticas

ingrese la descripción de la imagen aquí

1. Prototipos dinámicos

Desde el nombre, este tipo de celda se genera dinámicamente. Se controlan a través de su código, no del guión gráfico. Con la ayuda del delegado y la fuente de datos de la vista de tabla, puede especificar el número de celdas, las alturas de las celdas y el prototipo de celdas mediante programación.

Cuando arrastra una celda a su vista de tabla, está declarando un prototipo de celdas. Luego puede crear cualquier cantidad de celdas basadas en este prototipo y agregarlas a la vista de tabla mediante el cellForRowmétodo, mediante programación. La ventaja de esto es que solo necesita definir 1 prototipo en lugar de crear todas y cada una de las celdas con todas las vistas agregadas por usted mismo (Ver celda estática).

Entonces, en este caso, no puede conectar elementos de la interfaz de usuario en el prototipo de celda a su controlador de vista. Solo tendrá un objeto de controlador de vista iniciado, pero puede tener muchos objetos de celda iniciados y agregados a su vista de tabla. No tiene sentido conectar el prototipo de celda al controlador de vista porque no puede controlar varias celdas con una conexión de controlador de vista. Y obtendrá un error si lo hace.

ingrese la descripción de la imagen aquí

Para solucionar este problema, debe conectar su etiqueta de prototipo a un UITableViewCellobjeto. A UITableViewCelltambién es un prototipo de celdas y puede iniciar tantos objetos de celda como desee, cada uno de ellos se conecta a una vista que se genera a partir del prototipo de celda de la tabla del guión gráfico.

ingrese la descripción de la imagen aquí

Finalmente, en su cellForRowmétodo, cree la celda personalizada de la UITableViewCellclase y haga cosas divertidas con la etiqueta

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. Células estáticas

Por otro lado, las celdas estáticas están configuradas a través del guión gráfico. Tienes que arrastrar elementos de la interfaz de usuario a todas y cada una de las celdas para crearlos. Controlarás los números de celda, las alturas, etc. desde el guión gráfico. En este caso, verá una vista de tabla que es exactamente la misma desde su teléfono en comparación con lo que creó desde el guión gráfico. Las celdas estáticas se usan con más frecuencia para configurar la página, que las celdas no cambian mucho.

Para controlar los elementos de la interfaz de usuario para una celda estática, necesitará conectarlos directamente a su controlador de vista y configurarlos.

ingrese la descripción de la imagen aquí

Colmillo
fuente
@FangmingNing en mi código, yo todavía no puede cambiar la etiqueta de texto, tengo clase conectado a la celda, llamada celda correcta con el identificador, pero todavía no cambiar
Jorge Saraiva
@jorgesaraiva Discutamos esto en la sala de chat chat.stackoverflow.com/rooms/159396/discuss
Fangming
Me faltaba como! Tu celda . +100
Daniel Springer
Siempre es bueno tener un pequeño repaso después de trabajar en un proyecto en solo código durante 6 meses.
ttorbik
Gracias, mi problema es que lo estoy conectando al ViewController en lugar de a la celda.
Stella
23

Si está utilizando una vista de tabla para mostrar la Configuración y otras opciones (como lo hace la aplicación de Configuración integrada), puede configurar el Contenido de la vista de tabla en Celdas estáticas en el Inspector de atributos . Además, para hacer esto, debe incrustar su Vista de tabla en una instancia de UITableViewController.

Justin Domnitz
fuente
Esto es mucho más simple y rápido, y debería ser la respuesta aceptada en mi humilde opinión
Jaime Agudo
5

O no tiene que usar IBOutlet para referirse al objeto en la vista. Puede asignar un valor de etiqueta a la etiqueta en la tabla ViewCell , por ejemplo, establecer la etiqueta en 123 (el inspector de atributos puede hacerlo). Entonces puede acceder a la etiqueta por

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 
}
SLN
fuente
muy facil y sencillo! +100
Julian Silvestri
1

Conmigo tengo un UIViewcontroller, y en él tengo una vista de tabla con una celda personalizada. Mapeo mi salida de UILabel en UItableviewcellel UIViewControllerentonces recibí el error.

sotavento
fuente
haga una clase de celda personalizada e instancia iboutlet en su clase personalizada
Shauket Sheikh
0

Como la mayoría de la gente ha señalado que la subclasificación UITableViewCell resuelve este problema. Pero la razón no está permitida porque Apple define la celda prototipo ( UITableViewCell ) y no puede agregarle ninguna de sus propias salidas.

Nikhil Muskur
fuente
0

A veces, Xcode no puede controlar correctamente la conexión de salida de la celda.

De alguna manera, la etiqueta / botón de mi celda actual ha conectado otra celda, simplemente los elimino y el error desaparece.

Shourob Datta
fuente
-1

Haga clic en el simulador, navegue a la ventana y habilite Biseles del dispositivo

automatización de eng
fuente