从UIImageview的子类调用方法

时间:2011-04-23 02:15:03

标签: iphone class methods touch subclass

我有两个.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,但进度条的进度 - 没有移动。所以我已经解决了我的呼叫问题 - 现在需要解决为什么进度条没有移动!!

3 个答案:

答案 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

解决了这个问题