메서드가 여러 클래스를 허용하지만 IBOutlets를 사용하도록 허용하려면 다형성을 어떻게 사용합니까?
문제
나는 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
스토리보드에서 view controller1
.드래그 SuperClass
label
스토리보드에 view controller1
3)이제 다시 열려요 SuperClass
한쪽과 다른 쪽 view controller2
콘센트를 연결하고 SuperClass
에게 label
스토리보드에서 view controller2
.드래그 SuperClass
label
스토리보드에 view controller2
클릭하면 SuperClass
콘센트보다 다른 viewController에 연결된 두 개의 레이블이 표시됩니다.
다른 팁
선언하다 IBOutlet
안에 superclass
, AnimalView
.그런 다음 Interface Builder에서 사용자 정의를 설정하고 나면 UIView's
ID 검사기의 클래스는 다음과 같습니다. DogView
, Connections Inspector로 이동하여 nameLabel
거기있을 게.
@interface Parent : UIView
@property (nonatomic,weak) IBOutlet UILabel *nameLabel;
@end
@interface Child : Parent
@end