comment étendre un protocole pour un délégué en objective-C, puis une sous-classe d'un objet à exiger une conformité délégué
Je veux à la sous-classe UITextView, et envoyer un nouveau message sur le délégué. Donc, je veux étendre le délégué du protocole. Quelle est la manière correcte de le faire?
J'ai commencé avec ça:
interface:
#import <Foundation/Foundation.h>
@class MySubClass;
@protocol MySubClassDelegate <UITextViewDelegate>
- (void) MySubClassMessage: (MySubClass *) subclass;
@end
@interface MySubClass : UITextView {
}
@end
mise en œuvre:
#import "MySubClass.h"
@implementation MySubClass
- (void) SomeMethod; {
if ([self.delegate respondsToSelector: @selector (MySubClassMessage:)]) {
[self.delegate MySubClassMessage: self];
}
}
@end
cependant, avec qui je reçois l'avertissement: '-MySubClassMessage:' not found in protocol(s)
.
J'avais une façon de travailler de concert où j'ai créé mon propre ivar pour stocker le délégué, puis également stockées, le délégué à l'aide de [super setDelegate]
mais qui semblait mal. c'est peut-être pas.
Je sais que je peux juste passer l'id de la autour de et de, mais Mon objectif est de faire en sorte que le compilateur vérifie que tous les délégués fourni à MySubClass est conforme à MySubClassDelegate protocole.
Pour de plus amples clairfy:
@interface MySubClassTester : NSObject {
}
@implementation MySubClassTester
- (void) one {
MySubClass *subclass = [[MySubClass alloc] init];
subclass.delegate = self;
}
@end
va produire de l'avertissement: class 'MySubClassTester' does not implement the 'UITextViewDelegate' protocol
Je le veux pour produire de l'avertissement de ne pas mettre en œuvre 'MySubClassDelegate" protocole la place.
- mis à jour avec plus d'un exemple de code pour préciser davantage, brad fait plus clair pour moi que la
'-MySubClassMessage:' not found in protocol
n'était pas réellement en voyant que le compilateur a été de vérifier que le délégué était de bonne conformation de type. et que @option que j'ai eu pour MySubClassMessage fait de la question presque sans objet. 😉
Vous devez vous connecter pour publier un commentaire.
La
UITextView
définit sondelegate
commesens, il est conforme à
UITextViewDelegate
, et c'est ce compilateur vérifie. Si vous souhaitez utiliser le nouveau protocole, vous devez redéfinirdelegate
de se conformer à votre protocole:Le compilateur ne doit pas donner plus d'avertissements.
[Mise à jour par fess]
... Avec cela, le compilateur signale que les accesseurs doivent être mises en œuvre... [j'ai mis en place ce:]
"
[Mise à jour]
Je crois que cela devrait fonctionner si vous faites seulement un
@dynamic
de la déclaration au lieu de réimplémenter la méthode, comme la mise en œuvre est déjà là:- (void) setDelegate:(id<MySubClassDelegate>) delegate { [super setDelegate: delegate]; } - (id) delegate { return [super delegate]; }
Pour ceux qui sont encore intéressés, ce qui peut être fait tout simplement comme ceci (pour l'intérêt de l'exemple, j'ai sous-classe UIScrollView):
Le détail le plus important ici est la partie entre le <> après votre le nom de protocole qui, mis dans une manière simple, les signaux que vous êtes à l'extension de ce protocole.
Dans votre application, tout ce que vous devez faire est de:
Et vous avez terminé.
Vous avez besoin d'étendre la super protocole:
après que NE PAS (!!!) créer le @property pour le délégué sinon vous remplacer le délégué d'origine de l'objet, mais simplement de remplacer la méthode:
maintenant, vous pouvez utiliser le délégué à la manière classique:
Étant donné que MySubClassMessage: est facultatif, vous devez être en mesure de simple de faire:
Le compilateur doit toujours vérifier que la mise en œuvre de la classe est conforme à votre protocole (ou au moins prétendre dans l'en-tête) et vous n'aurez pas l'erreur que vous avez décrit.