Al crear una clase de subclases, también deseo crear una subclase de un delegado de la clase primaria dado que la subclase ahora tiene funcionalidad adicional. ¿Cuál es la mejor manera de hacer esto? Si tan sólo declaro otra propiedad delegado en la subclase con el mismo nombre que obtendría una advertencia "Tipo de propiedad 'id' es incompatible con el tipo 'id' heredado de 'ParentClass'¿Cómo subclonar apropiadamente una propiedad de delegado en Objective-C?
Respuesta
Siga el ejemplo de NSTableView
y NSOutlineView
.
NSOutlineView
es una subclase de NSTableView, y define su propio protocolo para su dataSource
y delegate
NSTableView
declara su delegado de esta manera:.
- (void)setDelegate:(id <NSTableViewDelegate>)delegate;
- (id <NSTableViewDelegate>)delegate;
y NSOutlineView
:
- (void)setDelegate:(id <NSOutlineViewDelegate>)anObject;
- (id <NSOutlineViewDelegate>)delegate;
Al parecer, el compilador es más indulgente con declaraciones de métodos desnudas de lo que es con declaraciones de bienes.
A diferencia de NSTable/OutlineView, es posible que desee hacer que el protocolo de la subclase herede del protocolo de la clase base, p. Ej.
@protocol SpecializedProtocol <BaseProtocol>
... probablemente depende de la situación.
dado este ejemplo que produce la advertencia:
// Class A
@protocol ClassADelegete;
@interface ClassA : NSObject
@property (nonatomic, weak) id<ClassADelegete> delegate;
@end
@protocol ClassADelegete <NSObject>
- (void)classADidSomethingInteresting:(ClassA *)classA;
@end
// Class B
@protocol ClassBDelegete;
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate; // Warning here
@end
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
dos soluciones que eliminan la advertencia son.
1) En la subclase, coloque la definición del protocolo antes de la definición de la clase. Esto es lo que UITableViewDelegate
en UITableView.h
hace:
// Class B
@class ClassB;
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate;
@end
2) En la subclase, agregue el protocolo original junto con el nuevo:
// Class B
@protocol ClassBDelegete;
@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate;
@end
@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end
Asumo (1) funciona como manzana hacerlo de esta manera, La opción (2) elimina la advertencia pero no he compilado y ejecuto nada configurado de esta manera.
- 1. ¿Cómo puedo pasar una propiedad como delegado?
- 2. C# Delegado de propiedad?
- 3. ¿Cómo creo un delegado para una propiedad .NET?
- 4. débil propiedad de delegado no puede formarse
- 5. propiedad "asignar" y "retener" para delegado
- 6. ¿Cómo configurar apropiadamente ActiveMQ con la agrupación?
- 7. Bloques ObjectiveC equivalente en Java
- 8. ¿Cómo hacer un objeto apropiadamente lavable?
- 9. ¿Cómo extender apropiadamente otras clases en Python? (python v3.3)
- 10. Dado el nombre de una propiedad, ¿cómo puedo crear un delegado para obtener su valor?
- 11. Cómo dividir la nueva línea de NSString en ObjectiveC
- 12. Generar métodos de delegado para una propiedad visible de una clase padre
- 13. enviar una notificación desde javascript en UIWebView a ObjectiveC
- 14. ObjectiveC Parse Integer from String
- 15. objectivec: fb publicar comentario error
- 16. Quitar apropiadamente el plugin StyleCop R #
- 17. ¿Cómo implementar un puente sin cargo en ObjectiveC/C?
- 18. Cómo implementar una propiedad en una interfaz
- 19. Necesita una definición concisa de "delegado"
- 20. ¿Cómo pasar una propiedad genérica como parámetro a una función?
- 21. Pros y contras del uso de excepción en IOS/ObjectiveC
- 22. Cómo convertir un delegado a un delegado idéntico?
- 23. Cómo configurar un delegado en una clase diferente
- 24. Evento, delegado o interfaz?
- 25. ¿Qué es Delegado y Métodos de delegado
- 26. ¿Cómo declaras un delegado predicado en línea?
- 27. patrón Delegado vs palabra clave delegado en C#
- 28. Crear una burbuja/círculo de color programáticamente en ObjectiveC y Cocoa
- 29. ¿Cómo configurar el delegado de scrollView desde una UITableView?
- 30. Cómo enlazar una propiedad de un elemento a una propiedad de otro en XAML
Fui con la última ruta (subclase del protocolo delegado después de la subclasificación de la clase principal), pero no pude declarar otra propiedad delegada sin desencadenar el error del compilador. ¿Las declaraciones de métodos que mencionaste son la única forma de hacer feliz al compilador? – Boon
No conozco otra forma de hacerlo. –