Como faço subclasse de uma variável com um IBOutlet?
Pergunta
Todos os descendentes da minha classe específica estão a ter um UILabel
variável de instância.Então, na minha classe pai eu tenho var label: UILabel
.Eu quero tê-lo no sublclass bem, mas como um IBOutlet
.Como eu faço isso?
Eu adicionei o IBOutlet
com o mesmo nome, e acrescentou fraco para ambas as declarações de variáveis.Mas eu recebo um erro sobre "Não pode substituir com uma propriedade armazenados".
Como devo fazer isto?E é possível não ter de criar uma instância da superclasse como " eu só quero isso para subclassificação?
Solução
Basta adicionar o IBOutlet
modificador na superclasse.
Outras dicas
Ao fazer isso você está re-declaring
o label
propriedade em uma subclasse. IBOutlet
é apenas um compilador noção para trabalhar com a Interface Builder.
Em Swift armazenados propriedades não pode ser substituído ou declarado novamente em uma subclasse.Eles só podem ser herdadas.
No entanto, você pode substituir o getter
e setter
de um properties
em subclasses para fornecer extra validações ou funcionalidades.Consulte o Swift guia: substituir getter setter
Você precisa declarar sua propriedade na superclasse com IBOutlet
.
Ou você pode fazer com uma propriedade diferente em sua subclasse.Como também não há o que significa que se você estiver se conectando a sua propriedade em uma das subclasses(super classe pode ter outros) e você não estiver fornecendo a esta implementação para outras subclasses de sua superclasse.
EDITAR:Você também pode definir label
saída para dois diferentes viewControllers
do seu SuperClass
a partir de story board se dar Subclasses
nomes em storyboard à vista diferentes Controladores.
Basta definir
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
repersent view controller1
no storyboard derivados de SuperClass
SubClass2
repersent outro view controller2
no storyboard derivados de SuperClass
Que Vá para Assistant Editor
e abrir SuperClass
de um lado, e de outro lado o view controller1
e ligar a saída de SuperClass
para label
no quadro em view controller1
.Arraste a partir de SuperClass
label
para storyBoard em view controller1
Agora abra novamente SuperClass
de um lado, e de outro lado o view controller2
e ligar a saída de SuperClass
para label
no quadro em view controller2
.Arraste a partir de SuperClass
label
para storyBoard em view controller2
Se você clicar em SuperClass
tomada do que você vai ver dois rótulos ligada a diferentes viewControllers
Concordaram que a resposta é simplesmente:
"Basta adicionar o
@IBOutlet
modificador na superclasse."
Uma nota que:se você vai estar expondo o ViewController em que o @IBOutlet
é definido através de um quadro (com Cartago), você precisará adicionar o public
atributo para a definição de variável. EDITAR:em vez disso, use open
palavra-chave de acesso`.
Vamos dizer que você tem um controlador de visualização CustomViewController subclassificação UITableViewController, o que você vai construir em Cartago-entregue quadro.Tudo o que deve estar acessível para o consumidor, a aplicação deve ser marcado public
:
public class CustomViewController: UIViewController {
override public func viewDidLoad() {
super.viewDidLoad()
}
@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!
A coisa agradável sobre esta abordagem (e eu estou totalmente a bordo com este caso de uso) é que você pode fazer o IBOutlet mapeamento na Interface do Construtor de superclasse, em seguida, mudar a classe da Cena para a subclasse, mantendo todos os mapeamentos.
E. g.: SubclassedCustomViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
Sei que esta pergunta foi postado há um tempo atrás, mas desde que sofri com o mesmo problema e, finalmente, surgiu uma solução, eu percebi que eu iria ainda postar as minhas conclusões...
Eu entendo que o problema a ser da seguinte maneira (pelo menos é o que eu resolvido):
Como tem A classe herda da classe B, e cada classe tem seu próprio arquivo XIB com algumas comuns IBOutlet propriedades? O objetivo é ser capaz de ter a super classe manipular as ações relacionadas com o IBOutlets que são comuns à sua subclasse(es), enquanto continuam sendo capazes de utilizar o Interface Builder para o projeto de uma interface para a subclasse(es).*
Para fazer isso:
- Fazer o IBOutlet conexões na superclasse da superclasse' arquivos XIB
- Fazer o IBOutlet conexões na subclasse da subclasse' XIB arquivos com o mesmo IBOutlet nomes de propriedade como na superclasse para o que você precisa para herdar.
- Eliminar a declaração do IBOutlet variáveis na subclasse