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?

Foi útil?

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 viewControllersdo 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

enter image description here

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top