Подкласс UIControl не может взять цель?

У меня есть подклассы UIControl, и в нем я отправляю:

[self sendActionsForControlEvents:UIControlEventValueChanged];

Когда я создаю экземпляр объекта, я добавляю цель следующим образом:

[starView addTarget:self action:@selector(starRatingChanged:) forControlEvents:UIControlEventValueChanged];

Представление отображается нормально, и без цели функциональность работает хорошо. Но при добавлении цели вылетает. Есть идеи, почему?

Мой класс объявлен с помощью:

@interface RMStarRating : UIControl {...}

Что бы это ни стоило, я настроил свое представление в - (void)layoutSubviews. Есть ли другой метод, который мне нужен для подкласса, чтобы цели были сохранены правильно или чтобы цели были отправлены с правильными действиями? Я думал, что UIControl позаботится о сохранении целей и действий для вас.

ОБНОВЛЕНИЕ: попытка предоставить больше информации

Я настроил объект следующим образом:

RMStarRating *starView = [[RMStarRating alloc] initWithFrame:CGRectMake(10, 70, 23*5, 30)];
[starView addTarget:self action:@selector(starRatingChanged:) forControlEvents:UIControlEventValueChanged];
....
[self.view addSubview:starView];

Мой sendAction, согласно предложению Джордана:

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    NSLog(@"send action");
    [super sendAction:action to:target forEvent:event];
}

Моя функция, которая вызывает sendActionsForControlEvents:

- (void)updateValue:(UITouch *)touch {
    ....
    NSLog(@"sendActionsForControlEvents");
    [self sendActionsForControlEvents:UIControlEventValueChanged];
}

И функция, которую надо вызвать (и она тоже есть в шапке):

- (void)starRatingChanged:(id)sender {
    NSLog(@"star rating changed");
}

И журнал просто выплевывает:

2010-10-22 09:45:41.348 MyApp[72164:207] sendActionsForControlEvents
2010-10-22 09:45:41.350 MyApp[72164:207] send action

Отладчик имеет:

картинка отладчика


person RyanJM    schedule 21.10.2010    source источник
comment
Почему происходит сбой? Какая строка кода? Что говорит стек вызовов? Может быть трудно спекулятивно диагностировать сбои.   -  person Shaggy Frog    schedule 22.10.2010
comment
Я не знаю, почему он разбился, это то, что я пытаюсь выяснить. Он падает на sendActionsForControlEvents: (если я не реализую ответ Джордана, и в этом случае он падает во время него). Я думаю, что что-то не так между соединением UIController и моим классом. И Бревно ничего не выплевывает, когда умирает.   -  person RyanJM    schedule 22.10.2010


Ответы (2)


Вы пробовали реализовать

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event

вместо? Хороший пример находится здесь:

Могу ли я переопределить UIControlEventTouchUpInside для UISegmentedControl?

person Jordan    schedule 21.10.2010
comment
Спасибо за эту ссылку. К сожалению, передача этого на super не сработала. sendAction:to:forEvent вызывается, но все равно падает. - person RyanJM; 22.10.2010
comment
Тогда у вас другая проблема. Выложите хотя бы крашлог, и код с sendAction, и setup. - person Jordan; 22.10.2010
comment
Я разместил больше информации, я надеюсь, что это поможет. Под журналом сбоев вы имеете в виду журнал разработки, верно? - person RyanJM; 22.10.2010
comment
Я добавил изображение того, что есть в отладчике. - person RyanJM; 22.10.2010
comment
@RyanJM Попробуйте изменить событие на UIControlEventAllEvents и посмотрите, сработает ли оно. Я создал проект шаблона, добавил RMStarRating, добавил цель, и мое событие starRatingChanged сработало. Без sendAction. - person Jordan; 22.10.2010

Хорошо, я понял, что это было. Я выпускал свой родительский класс слишком рано, поэтому не было объекта для отправки сообщения, даже если оно отображалось на экране.

И в итоге мне не понадобился sendAction:to:forEvent.

Джордан, спасибо за помощь.

person RyanJM    schedule 22.10.2010
comment
лол, видишь ли, будет лучше, если ты опубликуешь весь код, а не фрагменты. Трудно сказать, что происходит на самом деле. Рад, что ты понял это. - person Jordan; 22.10.2010