Почему я не могу получить правильный класс пользовательского класса через isKindOfClass? - PullRequest
2 голосов
/ 14 марта 2010

Я создал пользовательский класс AnimalView, который является подклассом UIView, содержащим UILabel и UIImageView.

@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. Правда ли, что AnimalView изменился на UIView, когда он добавлен в ViewController? Можно ли как-нибудь вернуть исходный класс пользовательского класса?

Ответы [ 3 ]

3 голосов
/ 14 марта 2010

Возможно, что в AnimalView не включено взаимодействие с пользователем, и он игнорирует прикосновения. Попробуйте установить [myView setUserInteractionEnabled:YES];

2 голосов
/ 14 марта 2010

Если у вас есть подпредставления в вашем 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];
    }
}
2 голосов
/ 14 марта 2010

Есть ли у AnimalView подпредставления UIView внутри? Это могут быть те, кто подхватывает сенсорные события. Вы можете отключить взаимодействие этих представлений с пользователем, инвертировав метод, описанный Дэвидом, во всех подпредставлениях вашего AnimalView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...