我有两个.m文件。第一个是主代码,第二个是UIImageView的子类,以便我可以检测到触摸 在主.m文件中,我添加了一个进度条和一个customimageview两个scrollview的子视图。
我需要的是当用户触摸customimageview时,进度条向上移动并且双击减少[注意:customimageview必须在第二个.m中识别其触摸,因为它们位于子视图中必须处理滚动视图和其他控件]
在主.m文件中,我有两种方法:
- (void)pumpsingletap {
progbm.progress +=0.1;
}
- (void)pumpdoubletap {
progbm.progress -=0.1;
}
然后在子类uiimageview中我有:
//inside touches method
if ([touch view].tag == 555) {
NSLog(@"pump touched");
switch ([allTouches count]) {
case 1: {
switch ([touch tapCount]) {
//---single tap---
case 1: {
NSLog(@"single pump touch");
[self performSelector:@selector(pumpsingletap) withObject:nil afterDelay:.4];
} break;
//---double tap---
case 2: {
NSLog(@"double pump touch");
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(pumpsingletap) object:nil];
[self performSelector:@selector(pumpdoubletap) withObject:nil afterDelay:.4];
} break;
}
}
}
}
因此,NSlog出现,因此触摸识别不是问题。但是performSelector倒下了。由于customimageview pumpingletap不起作用。
那么我如何在子类中调用该方法。
//更新//
所以我在下面的代码中添加了我的子类
mainMethod* callingMethod = [[mainMethod alloc] init];
[callingMethod performSelector:@selector(pumpsingletap) withObject:nil afterDelay:.4];
然后在我的主要方法中,对于pumpingletap,我将其更改为:
- (void)pumpsingletap {
NSLog(@"single pump method called");
progbm.progress +=0.1;
}
出现了用于单泵方法的NSLog,但进度条的进度 - 没有移动。所以我已经解决了我的呼叫问题 - 现在需要解决为什么进度条没有移动!!
答案 0 :(得分:0)
如果我正确地遵循代码,那么你在self上执行选择器,但self是派生的UIImageView类(所以你可能在那时崩溃?)。您需要在主文件中的类上执行选择器。将对它的引用传递给派生类。或者,您可以创建一个委托,在主类中实现它,将主类传递给UIImageView然后通过委托调用(甚至还有其他方法(键值观察),但其中一个应该工作)。
答案 1 :(得分:0)
我不确定这是否是问题,但你不需要围绕案例陈述使用括号。另外我不明白你为什么要在开关内进行切换。只要制作一个if-elseif-else语句,它可能会更容易理解。
除此之外,根据我的理解,你有一个带有进度条和customimageview作为属性的视图控制器,你有一些方法应该被调用以响应某些动作,(点击或双击customimageview)但他们在视图控制器中。解决此问题的常用方法是使用目标操作机制。 UIControl通过封装目标 - 动作对并将它们存储在由事件类型(UIControlEvent)键入的字典中来实现目标动作机制。这是一个稍微简单的版本。
在UIImageView子类的.h文件中,在@interface
写下之前:
typedef enum {
ControlEventTap = 0,
ControlEventDoubleTap
} ControlEvent;
然后在.m文件中在@implementation之前添加它:
@interface TargetActionPair : NSObject {
id target;
SEL action;
}
@property (nonatomic, assign) id target;
@property (nonatomic, assign) SEL action;
@end
@implementation TargetActionPair
@synthesize target, action;
@end
然后,将NSMutableArray实例变量(但不是属性)和- (void)setTarget:(id)t action:(SEL)a forEvent:(ControlEvent)e
方法添加到customimageview实现中。
该方法应如下所示:
- (void)setTarget:(id)t action:(SEL)a forEvent:(ControlEvent)e {
TargetActionPair *tar_act = [[TargetActionPair alloc] init];
tar_act.target = t;
tar_act.action = a;
// actionsArray is the mutable array instance variable and must be allocated and set in the init method for customimageview.
[actionsArray replaceObjectAtIndex:(NSUInteger)e withObject:tar_act];
[tar_act release];
}
然后,您可以使用以下方法替换触摸处理代码:
if ([touch view].tag == 555) {
NSUInteger tapcount = [touch tapCount];
if (([alltouches count] == 1) && (tapcount <= [actionsArray count])) {
TargetActionPair *tar_act = [actionsArray objectAtIndex:tapcount-1];
[tar_act.target performSelector:tar_act.action withObject:nil afterDelay:.4];
if (tapcount == 2) {
TargetActionPair *tar_act2 = [actionsArray objectAtIndex:tapcount-2];
[NSObject cancelPreviousPerformRequestsWithTarget:tar_act2.target selector:tar_act2.action object:nil];
}
}
}
使用此代码,您只需在包含customimageview的视图控制器的viewDidLoad方法中为每个控件事件设置目标和操作。所以调用看起来像这样:
[self.customimageview setTarget:self action:@selector(pumpsingletap) forEvent:ControlEventTap];
[self.customimageview setTarget:self action:@selector(pumpdoubletap) forEvent:ControlEventDoubleTap];
请勿忘记在dealloc方法中释放actionsArray,并且要非常小心释放视图控制器,因为customimageview不会保留它。
我希望这对您的应用程序有所帮助。
答案 2 :(得分:0)
最后,我使用NSNotificationCenter
解决了这个问题