我将在几个视图中使用我在视图控制器中使用的相同代码,我不想将代码粘贴到每个视图中。
有人可以向我展示几行代码,告诉我如何做到这一点吗?
我猜我将不得不在接口中声明一个类的实例,并为每个触摸函数设置一个回归方法,我将进行子类化?
答案 0 :(得分:2)
如果我正确理解了这个问题,你需要为每个视图中的touchesBegan,touchesMoved ...执行相同的代码。
我这样做的方法是使用委托模式。
@protocol ViewTouchDelegate
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
@end
@interface ViewA : UIView {
id <ViewTouchDelegate> touchDelegate;
}
@implementation ViewA
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self->touchDelegate touchesBegan:touches withEvent:event];
}
@end // End View A
@interface ViewB : UIView {
id <ViewTouchDelegate> touchDelegate;
}
@implementation ViewB
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self->touchDelegate touchesBegan:touches withEvent:event];
}
@end // End View B
这将允许您将所有触摸处理代码放在一个位置(在符合ViewTouchDelegate协议的类中),并将该代理提供给您的每个视图。
在我的例子中,我将touchesBegan的签名与UIResponder的touchesBegan相同,但你可以根据自己的需要进行定制。
编辑:示例ViewTouchDelegate
@interface MyViewTouchDelegate : NSObject <ViewTouchDelegate>
@end
@implementation MyViewTouchDelegate
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//put all your common touch handling code in here
}
@end
为了您的目的,在ViewTouchDelegate协议中定义您需要的任何其他方法,例如touchesMoved,touchesEnded,yourOwnCustomEvent。
答案 1 :(得分:1)
创建一个适当的超类,需要进行子类化,以便执行您需要的特定任务。这是OOP如此出色的众多原因之一:P
例如,您在objective-c中创建的每个对象都是NSObject的子类,它包含标准方法,例如release retain和init,它们最初创建对象。
如果您想编写一个游戏,您可以创建一个名为object的超类,它将被子类化为指定某些类型的对象,如props或ragdolls。
答案 2 :(得分:1)
正如 Antwan 和 jjwchoy 所提到的,有几种方法可以做这样的事情。在大多数OOP语言中,子类化是首选方式。子类继承其超类的所有处理以及您的自定义行为。为此,您将以类似于下面所示的方式实现类:
在 JULView.h (新类的名称)中会有一些像这样的代码
#import <Foundation/Foundation.h>
//... #import for all of the other classes/libraries you need
@interface JULView : UIView
{
// your iVars go here
}
// Your Custom Properties and Methods go here
- (void)customMethod
@end
并在实施文件( JULView.m )
中#import "JULView.h"
// Synthesize your properties here
@implementation JULView
#pragma mark - Initialization
- (id)init
{
[super init];
// Additional initialization
}
#pragma mark - Custom methods
- (void)customMethod1
{
// A custom method code
}
#pragma mark - Overwritten UIView Methods
// Your touch handling stuff
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// Your code
}
@end
要使用此新子类,只需导入头文件
即可#import "JULView.h"
进入您正在使用的类并实例化JULView,就像使用UIView
一样// instead of
UIView *aView = [[UIView alloc] init];
// you would use
JULView *aView = [[JULView alloc] init];
除了子类化之外,Objective-C还提供了一些实现此目的的方法:委托模式和类别。 jjwchoy 在描述实现代表使用的常用方法方面做得非常出色,因此没有必要对其进行反刍。相反,我们来看看类别。
类别使用其他方法扩展现有类,或使用现有方法的版本扩展。例如,假设您要添加一个将字符串的第一个字母返回给NSString的方法。为此,您将创建一个类别,如下所示:
界面 - JULString.h
#import NSString
@interface NSString (JULString)
-(NSString *) firstLetter;
@end
实现 - 典型的约定是类别的文件名是您要扩展的类的名称,后跟“+”和类别的名称。在这种情况下,文件将被称为 NSString + JULString.m
#import "NSString+JULString.h"
@implementation NSString ( JULString )
- (NSString *)firstLetter
{
return [NSString stringWithFormat:@"%C", [self characterAtIndex:1]];
}
@end
关于类别的巧妙之处在于,现在它们扩展了您正在使用的类的任何实例的行为。换句话说,应用程序中的任何NSString都将使用您的新方法(前提是您导入正确的头文件)。但要注意,因为强大的力量带来了巨大的责任。使用类别行为覆盖类可能会导致不良影响,因此要小心。
您可能想要检查的几个链接是:
注意:的 我没有我的Mac,所以我写这个代码基本上是在我的头顶(并使用上面的网站中的一些代码作为提醒)。所以我提前为任何错误道歉;)