2010-03-14 107 views
2

我创建了一个自定义类AnimalView,它是UIView的一个子类,其中包含UILabelUIImageView为什么我无法通过isKindOfClass获得正确的自定义类的类?

@interface AnimalView : UIView { 
    UILabel *nameLabel; 
    UIImageView *picture; 
} 

然后,我在几个AnimalView添加到ViewController.view。在touchesBegan:withEvent:方法中,我想检测触摸对象是否为AnimalView。这里是viewController的代码:

@implementation AppViewController 

- (void)viewDidLoad { 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:... 
    [self.view addSubview scrollview]; 

    for (int i = 0; i<10; i++) { 
     AnimalView *newAnimal = [[AnimalView alloc] init]; 
     // customization of newAnimal 
     [scrollview addSubview:newAnimal; 
    } 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    UIView *hitView = touch.view; 
    if ([hitView isKindOfClass:[AnimalView class]]) { 
     AnimalView *animal = (AnimalView *)hitView; 
     [animal doSomething]; 
    } 
} 

但是,当我点击动物时什么都没有发生。当我检查hitView的等级NSLog(@"%@", [hitView class])时,它总是显示UIView而不是AnimalView。当它被添加到ViewController时,AnimalView是否改为UIView?有什么方法可以找回自定义类的原始类吗?

回答

2

AnimalView是否具有UIView子视图?他们可能是接触触摸事件的人。您可以通过颠倒您的AnimalView的所有子视图中David描述的方法来禁用这些视图的用户交互。

+0

感谢Brad提醒。当我远离我的Mac时,我完全忘记了在AnimalView中还有一个UIView。这完全解决了我的头痛。非常感谢!! – Anthony 2010-03-14 12:20:10

3

有可能AnimalView没有启用用户交互并忽略触摸。尝试设置[myView setUserInteractionEnabled:YES];

+0

感谢大卫。我已经在其init方法中将AnimalInteractionEnabled属性设置为YES。事实上,当我点击它们时,我收到了“UIView”的回报。但我想要的是“AnimalView”的回报。不管怎么说,还是要谢谢你。 – Anthony 2010-03-14 03:54:44

2

如果你在你的AnimalView子视图,您可以通过上海华层次遍历,看是否触摸是由你的AnimalView的子视图,通过使用这样的代码来处理:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    UIView *hitView = touch.view; 

    AnimalView *animal = nil; 
    while (hitView != nil) { 
     if ([hitView isKindOfClass:[AnimalView class]]) { 
      animal = (AnimalView *) hitView; 
      break; 
     } 
     hitView = [hitView superview]; 
    } 

    if (animal) { 
     [animal doSomething]; 
    } 
} 
+0

感谢您的回答。但事实证明,这是我自己的一个愚蠢的错误。不管怎么说,还是要谢谢你! – Anthony 2010-03-14 12:21:03

+0

不是问题!在复杂视图(即有多个子视图的视图)上拦截触摸事件时,我发现此技术非常有用,因为我无法访问视图的源代码,因此无法破解/修改其行为。 – 2010-03-14 14:43:24

相关问题