Pregunta

Todos los descendientes de mi clase específica deben tener un UILabel Instancia variable.Entonces en mi clase de padres tengo var label: UILabel.También quiero tenerlo en la subclase, pero como IBOutlet.¿Cómo hago esto?

Agregué el IBOutlet del mismo nombre, y agregó débil a ambas declaraciones de variables.Pero aparece un error que dice "No se puede anular con una propiedad almacenada".

¿Cómo debería hacer esto?¿Y es posible no tener que crear una instancia de la versión de la superclase ya que solo la quiero para la creación de subclases?

¿Fue útil?

Solución

Solo agrega el IBOutlet modificador en la superclase.

Otros consejos

Al hacerlo eres re-declaring el label propiedad en una subclase. IBOutlet es solo una noción de compilación para trabajar con Interface Builder.

En rápido propiedades almacenadas no se puede anular ni redeclarar en una subclase.Sólo se pueden heredar.

Sin embargo, puedes anular el getter y setter de un properties en subclases para proporcionar validaciones o funcionalidades adicionales.Consulte la guía Swift: anular getter setter

Debe declarar su propiedad en superClass con IBOutlet.

O puede crear una propiedad diferente en su subclase.Además, no tiene sentido si está conectando su propiedad en una de las subclases (la superclase puede tener otra) y no está proporcionando esta implementación a otras subclases de su superclase.

EDITAR:También puedes configurar label salida a dos diferentes viewControllersde tu SuperClass del storyboard si das Subclasses nombres en el guión gráfico a diferentes controladores de vista.

solo define

 class SuperClass{
     @IBOutlet weak var label: UILabel! = nil

 }

SubClass1 representar view controller1 en el guión gráfico derivado de SuperClass SubClass2 representar a otro view controller2 en el guión gráfico derivado de SuperClass

Que ir a Assistant Editor y abierto SuperClass un lado y otro lado view controller1 y conecte la salida de SuperClass a label en el tablero gráfico en view controller1.Arrastrar desde SuperClass label al storyboard en view controller1

enter image description here

Ahora de nuevo abierto SuperClass un lado y otro lado view controller2 y conecte la salida de SuperClass a label en el tablero gráfico en view controller2.Arrastrar desde SuperClass label al storyboard en view controller2

Si haces clic en SuperClass outlet, verá dos etiquetas conectadas a diferentes viewControllers

Estuvimos de acuerdo en que la respuesta corta es simplemente:

"Sólo añade el @IBOutlet modificador en la superclase."

Sin embargo, una nota:si va a exponer el ViewController en el que se encuentra el @IBOutlet se define a través de un marco (con Cartago), deberá agregar el public atributo a la definición de variable. EDITAR:en su lugar, utilice open acceder a la palabra clave`.

Digamos que tienes un controlador de vista. Controlador de vista personalizado subclasificación Controlador UITableView, que construirá en el marco entregado por Carthage.Todo lo que debería ser accesible para la aplicación del consumidor debe etiquetarse. public:

public class CustomViewController: UIViewController {

    override public func viewDidLoad() {
        super.viewDidLoad()
    }

@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!

Lo bueno de este enfoque (y estoy totalmente incorporado en este caso de uso) es que puede realizar el mapeo de IBOutlet en Interface Builder en la superclase, luego cambiar la clase de la escena a la subclase, mientras conserva todas las asignaciones.

P.ej.: SubclaseCustomViewController

import UIKit
import mymodule

class SubclassedCustomViewController: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        myBackgroundView.backgroundColor = UIColor.blueColor()
        myLabel.text = "My special subclass text"
    }

Me doy cuenta de que esta pregunta se publicó hace un tiempo, pero como luché con el mismo problema y finalmente encontré una solución, pensé que aún así publicaría mis hallazgos...

Entiendo que el problema es el siguiente (al menos ese es el que resolví):

¿Cómo hacer que la clase A herede de la clase B, y que cada clase tenga su propio archivo XIB con algunas propiedades IBOutlet comunes? El objetivo es poder hacer que la superclase maneje las acciones relacionadas con los IBOutlets que son comunes a sus subclases, y al mismo tiempo poder usar Interface Builder para diseñar la interfaz para las subclases.*

Con el fin de hacerlo:

  • Haga las conexiones IBoutlet en la superclase desde los archivos XIB de la superclase
  • Haga las conexiones IBoutlet en la subclase desde los archivos XIB de la subclase, con los mismos nombres de propiedades de Iboutlet que en la superclase para los que necesita heredar.
  • Eliminar la declaración de las variables IBOutlet en la subclase
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top