Si vous souhaitez remplacer des méthodes dans les classes d'interface utilisateur, vous pouvez remplacer les méthodes dans les classes de base (UIView ou UIViewController). Si vous ne voulez pas appeler super
dans un code de vos classes. Vous devriez balayer les méthodes à l'intérieur de votre sous-classe.
Pour ce faire, je vois deux solutions:
1. D'abord, créez une sous-classe personnalisée pour UIView, UIControl, UIViewController. Ces sous-classes doivent avoir des méthodes de swizzled et n'appellent pas super
.
@interface CustomViewBase
@end
@implementation CustomViewBase
+ (void)initialize
{
[SwizleLib swizleMethodsInClass:[self class]];
}
- (BOOL)touchBegin<.....>
{
return YES;
}
@end
Et vous allez créer des sous-classes CustomViewBase et appeler super
mise en œuvre pour toutes les méthodes. (N'oubliez pas que vous devez créer des sous-classes pour UIView, UIControl, UIViewController, UIButton, UITableViewCell).
2.Si vous ne voulez pas modifier une classe de base (vous voulez utiliser UIView comme sous-classe pour vos classes d'interface utilisateur), vous devez inverser les méthodes dans vos sous-classes (puisque vous ne voulez pas appeler super
).
Regardez une méthode qui fonctionne: http://nshipster.com/method-swizzling/. Je pense que c'est quelque chose dont tu as besoin. (Je pense que vous pouvez faire basculer la méthode beginTouch dans la classe UIView pour obtenir un comportement nécessaire). –
@AndrewRomanov Je développe la bibliothèque en utilisant Swift et en utilisant la méthode swizzling. Mais dans l'application, j'ai besoin d'appeler l'implémentation du super pour lancer la méthode Swizzling. Y a-t-il une meilleure façon de faire cela? – Sac
Qu'en est-il des méthodes swizzle à l'intérieur de vos classes (si vous ne voulez pas appeler super)? Par exemple, vous pouvez créer une méthode: subscribeToTouchesForClass (Class classVar) et définir votre classe comme classVar. –