2010-01-21 4 views
0

В текущей книге, которую я читаю, автор реализует IBAction для слайдера следующим образом (см. Ниже V001). На мой взгляд, это показалось немного сложнее, поэтому я пересмотрел код (V002). Правильно ли я считаю, что отправитель является указателем на объект, который уволил событие? Кроме того, есть ли недостаток в отправке отправителя в заголовке, вместо того, чтобы оставлять его в качестве отправителя и отбрасывать его в тело метода?iPhone метод действия UISlider

V001

-(IBAction)sliderChange:(id)sender { 
    UISlider *slider = (UISlider *)sender; 
    int progressAsInt = (int)([slider value] + 0.5f); 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; 
    [sliderLabel setText:newText]; 
    [newText release];  
} 

V002

-(IBAction)sliderChange:(UISlider*)sender { 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d",(int)[sender value]]; 
    [sliderLabel setText:newText]; 
    [newText release]; 
} 

Гэри

ответ

3

идентификатор специальный тип, который может содержать любой объект. Нюанс заключается в том, что у вас нет четко определенной безопасности типов. Вы можете вызывать любой селектор для любого объекта, и если он существует, он будет вызываться.

В V001, делая [значение ползунка] вместо [значения отправителя], более логичный смысл, который, я думаю, вероятно, почему вы перенесли на рефакторинг в первую очередь, потому что он, похоже, не вызывался.

В V002 [значение отправителя] извлекает свойство float того же UISlider, но скрывает тот факт, что вы не можете получить объект слайдера, и он может быть на любом объекте.

Это вопрос стиля и дискриминации. Я очень усердлив в своем собственном коде, чтобы определить, какой конкретный объект я пытаюсь получить доступ к селектору, и даже до тех пор, пока вы вызываете isKindOfClass, и проверяете, что я вызываю селектор в правильном объекте UISlider. Чтобы ответить на ваш вопрос об обратной стороне: тип объекта не устраняется, как и при использовании id.

Почему? Я хочу, чтобы несколько слайдеров в одном представлении обрабатывали событие слайдера, я не хочу, чтобы один слайдер воздействовал на данные обоих, даже если я могу обращаться с ними одинаково.

+0

Благодарим вас за комментарии. Существует ли какое-либо соглашение, в котором по именованию переменной «отправитель» остается неизменным, я мог бы переименовать его «слайдер», чтобы лучше представлять объект в использовании? – fuzzygoat

+0

Немного ловить-22. Наличие (id) отправителя несколько условно, так что вы знаете, что вызывающий селектор является обработчиком для действия для setTarget, для управления движением кнопки/ползунка и т. Д. –

+0

Спасибо, очень оцененный – fuzzygoat

Смежные вопросы