Как мне использовать полиморфизм, чтобы метод мог принимать несколько классов, но с помощью IBOutlets?

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

  •  02-01-2020
  •  | 
  •  

Вопрос

У меня есть конкретный метод, который принимает UIView объект, и я хочу передать ему объекты, которые могут относиться к одному из двух классов.Скажем, он принимает UIView который представляет животное, я хочу иметь возможность передать DogView и CatView или потенциально другие классы животных.

В рамках этого метода я хочу установить nameLabel взгляд, который есть у всех животных.Как мне настроить его, чтобы я мог это сделать?

Моей первой реакцией было желание иметь суперкласс (например, AnimalView), который имеет nameLabel переменную, а затем подклассифицировать ее для каждого нового животного.Однако, если я хочу, чтобы nameLabel чтобы быть выходом, он не кажется настраиваемым, поскольку я не мог иметь переменную в каждом подклассе, к которой можно было бы подключить представление в IB.

Затем я попробовал Protocol, но это не полиморфизм, и я не смогу получить доступ к свойству nameLabel через общий суперкласс, не так ли?В отличие от Objective-C я не мог попросить UIView <ProtocolName> и тогда это позволило бы мне попросить об этом.

Как мне следует это делать?Я просто хочу иметь возможность передавать различные типы объектов и обеспечивать их совместимость с Interface Builder.Должен ли я подойти к этому совершенно по-другому?

Это было полезно?

Решение

Вы можете подключить розетку label к разным viewControllers с вашей SuperClass из раскадровки если у тебя другое viewControlelrs в раскадровке Subclasses(полученные от SuperClass) имена в раскадровке.

1) Просто определите

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

 }

SubClass1 представитель view controller1 в раскадровке, полученной из SuperClass SubClass2 представлять другого view controller2 в раскадровке, полученной из SuperClass

2) Затем перейдите Assistant Editor и открыть SuperClass одна сторона и другая сторона view controller1 и подключите розетку от SuperClass к label в StoryBoard в view controller1.Перетащите из SuperClass label в StoryBoard в view controller1 enter image description here

3)Теперь снова открываем SuperClass одна сторона и другая сторона view controller2 и подключите розетку от SuperClass к label в StoryBoard в view controller2.Перетащите из SuperClass label в StoryBoard в view controller2

Если вы нажмете на SuperClass выход, чем вы увидите две метки, связанные с разными контроллерами представления.

Другие советы

Объявить IBOutlet в superclass, AnimalView.Затем в Interface Builder, как только вы установите пользовательский UIView's класс в инспекторе удостоверений будет DogView, перейдите в Инспектор подключений и nameLabel Будет здесь.

@interface Parent : UIView

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

@end

@interface Child : Parent

@end

enter image description here

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top