2010-03-14 103 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

相關問題