¿Cómo puedo subclasificar una variable con un IBOutlet?
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?
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 viewControllers
de 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
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