Como eu usaria o polimorfismo para permitir que um método aceitasse múltiplas classes, mas com IBOutlets?

StackOverflow https://stackoverflow.com//questions/25089654

  •  02-01-2020
  •  | 
  •  

Pergunta

Eu tenho um método específico que aceita um UIView objeto, e quero passar para ele objetos que podem ser de uma de duas classes.Então diga que aceita um UIView que representa um animal, quero poder passar um DogView e um CatView ou outras classes de tipo animal potencialmente.

Dentro desse método eu quero definir o nameLabel vista, que todos os animais têm.Como faço para configurá-lo para poder fazer isso?

Minha primeira reação foi ter uma super aula (como AnimalView) que tem o nameLabel variável nele e, em seguida, subclasse-a para cada novo animal.No entanto, se eu quiser o nameLabel para ser uma saída, não parece configurável, pois não poderia ter a variável em cada subclasse para conectar a visualização no IB.

Eu então tentei um Protocol, mas isso não é polimórfico e eu não seria capaz de acessar a propriedade nameLabel por meio de uma superclasse genérica, poderia?Ao contrário do Objective-C, eu não poderia pedir um UIView <ProtocolName> e isso me permitiria pedir isso.

Como devo fazer isso?Eu só quero poder passar diferentes tipos de objetos e ser compatível com o Interface Builder.Eu deveria abordar isso de forma completamente diferente?

Foi útil?

Solução

Você pode conectar uma tomada de label para diferente viewControllers com o seu SuperClass do storyboard se você é diferente viewControlelrs no reperset do storyboard por Subclasses(derivados de SuperClass) nomes no storyboard.

1)Basta definir

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

 }

SubClass1 representar view controller1 no storyboard derivado de SuperClass SubClass2 representar outro view controller2 no storyboard derivado de SuperClass

2) Do que ir para Assistant Editor e aberto SuperClass um lado e outro lado view controller1 e conecte a tomada de SuperClass para label no storyboard em view controller1.Arraste de SuperClass label para storyBoard em view controller1 enter image description here

3)Agora abra novamente SuperClass um lado e outro lado view controller2 e conecte a tomada de SuperClass para label no storyboard em view controller2.Arraste de SuperClass label para storyBoard em view controller2

Se você clicar em SuperClass tomada, você verá dois rótulos conectados a diferentes viewControllers

Outras dicas

Declare o IBOutlet em um superclass, AnimalView.Então, no Interface Builder, depois de definir o personalizado UIView's classe no inspetor de identidade para ser DogView, vá para o Connections Inspector e seu nameLabel estarei lá.

@interface Parent : UIView

@property (nonatomic,weak) IBOutlet UILabel *nameLabel;

@end

@interface Child : Parent

@end

enter image description here

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top