Como eu usaria o polimorfismo para permitir que um método aceitasse múltiplas classes, mas com IBOutlets?
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?
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
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