이것은 상당히 복잡한 상속 계층이기 때문에 나와 함께 감당해야한다. (사용하고있는 정확한 사례를 언급하지 않고 단순화하려고 노력했다.) -Objective-C - 서브 클래스에있는 델리게이트의 서브 클래스
UITextField
의 하위 클래스 인 TextField
을 내 자신의 맞춤 확장 된 범용 텍스트 필드로 만듭니다. 이제이 향상된 기능을 제공하기 위해 TextField
메서드의 init
메서드에서 UITextField
의 모든 대리 메서드가 TextField
으로 전송되도록 super.delegate = self
을 설정했습니다. TextField
은 UITextFieldDelegate
프로토콜을 구현하고 흥미로운 작업을 수행하는 위임 메소드를 수신합니다.
그러나 차례로 나는 TextField
에 자신의 대리인이되도록 만들고 싶습니다. 그래서 TextFieldDelegate
이라는 새로운 프로토콜을 만들고 (UI
-prefix가 없다는 것을 유의하십시오!) 다른 클래스가 TextField
에서 대리자 메소드를 수신 할 수 있도록 TextField
ivaya id<TextFieldDelegate> __weak delegate
에 해당 속성을 지정합니다.
아직 너무 복잡하지 않으므로 계속 나와 함께 있기를 바랍니다. 하지만 이제는 TextField
의 또 다른 사용자 정의 하위 클래스를 만들고이를 PasswordTextField
이라고합니다 (실제로는 암호 기능을 구현하기 위해 서브 클래스를 만들지 않아도되지만 상당히 정교한 구현이 있다고 가정 해 봅시다. 그게 필요합니다).
PasswordTextField
(TextField
에 대리자 속성이있는 것처럼)이 향상된 대리자 메서드 집합을 보낼 수 있도록하려고한다고 가정 해 봅시다. 예를 들어 암호가 필요한 수준에 도달하면 전송되는 방법 passwordIsSecure
을 보낼 수 있습니다. 이제 일반 TextField
에없는이 동작 이후로 PasswordTextField
및에 대한 새 위임 메서드를 정의하는 PasswordTextFieldDelegate <TextFieldDelegate>
을 TextField
에 의해 전송 된 모든 대리자 메서드를 상속합니다.
문제는 다음과 같습니다. PasswordTextField
에 어떻게 구현합니까? 작동하지 않는 것 : TextField
의 위임 만에 TextFieldDelegate
하지 PasswordTextFieldDelegate
을 준수하기 때문에
상속
단순히, TextField
에서 대리자를 상속 할 수 없습니다, 그래서 [delegate passwordIsSecure]
같은 방법을 보낼 수 없습니다 때문에 TextFieldDelegate
에는 그러한 방법이 없습니다.
재정 바르
내가 대표라는PasswordTextField
에 바르를 선언 해 낼 수 있지만 컴파일러는 물론 슈퍼 클래스의 대표라는 아이바가 이미 있기 때문에이 중복 선언이라고 불평, 그래서
이 어느 쪽도 * 작동하지 않습니다.수정
슈퍼 클래스
나는 TextField
클래스로 돌아가서 구현하기 위해 대리자를 다시 정의 할 수 모두 TextFieldDelegate
및PasswordTextFieldDelegate
,하지만이 지저분한 것하고, PasswordTextFieldDelegate
방법을 보낼 수 TextField
을 알려줍니다의 물론, 그럴 수 없어!
나는이 책에서 모든 합리적인 코딩 규칙을 깨뜨린 것처럼 보이기 때문에 이것을 시도하지 않았습니다.
요약하면, 클래스의 서브 클래스가 슈퍼 클래스의 위임자의 하위 대리인이며이 모든 것이 잘 어울리는 것처럼 자신 만의 대리자를 가질 수있는 몇 가지 방법이 있어야합니다. 그걸 알아 내려고 하지마! 어떤 아이디어?
는 (* 측면의 문제로서, 나는PasswordTextField
는 "중복"바르라는 이름의 대리자를 선언 할 때 컴파일러가 불평 이유를 이해하지 않지만,
TextField
은 아마도
UITextField
의 중복 인 바르라는 이름의 대리자를 선언 할 때 불평하지 않는다 대리자라는 속성!)
은 어둠 속에서 타격 메신저있을 수 있습니다 ..하지만 당신은 단지 ID와 대리인의 @property를 다시 선언하고 자신의 합성이 경우 도움을 wouldnt? 나는 그것이 효과가있을 것이라고 생각한다. mebbe 아프다 잠시 후 시도하십시오. –
govi