2012-03-29 3 views
0

Я не мастер Objective-C, и у меня есть некоторые проблемы с чем-то простым в Javascript (создание и привязка слушателя) ... Просто не можете понять, как это сделать в Objective-C.UISlider делегат/привязка к другому объекту?

Итак, у меня есть UISlider. Всякий раз, когда пользователь начинает перетаскивать его, я хочу запустить функцию X из объекта (в этом случае MKAnnotation, но любой NSObject, Controller и т. Д. Должен быть способен слушать).

Является ли делегат правильным для использования? Я пробовал это без успеха:.

В моей ViewController.h

@protocol TimeSliderDelegate <NSObject> 
- (void)sliderValueChanged:sender; 
@end 

@interface ViewController : UIViewController<MKMapViewDelegate>{ 
    IBOutlet UISlider *timeSlider; 
    IBOutlet MKMapView *mapView; 
    id <TimeSliderDelegate> delegate; 
} 

@property (retain) id delegate; 

Тогда, в моем ViewController.m, я обязан моей ValueChanged от моего UISlider к этому (опробованы [собственного делегата] и [отправитель делегата] без результата. .):

- (IBAction)timeSliderValueChanged:(id)sender { 
    [delegate sliderValueChanged:sender]; 
} 

Он падает здесь, говоря косяк селектора находки sliderValueChanged для делегата, например ... Я до сих пор разработать остальную часть моего кода.


Мой тестовый объект является MKAnnotation, что я добавляю в моем MKMapView внутри моей ViewController, ничего фантазии здесь я просто добавить его, как это.

Annotation *annotation = [[Annotation alloc] init]; 

CLLocationDegrees lat = 0; 
CLLocationDegrees lng = 0; 
[(Annotation*) annotation setCoordinate:CLLocationCoordinate2DMake(lat, lng)]; 
[mapView addAnnotation:annotation]; 

Тогда в моем Annotation.h, я импортировать мой ViewController и установить его в качестве TimeSliderDelegate и реализации sliderValueChanged.

#import "ViewController.h" 
@protocol TimeSliderDelegate; 

@interface Annotation : MKAnnotation<TimeSliderDelegate> 
- (void)sliderValueChanged:(id)sender; 

Наконец, это был мой код в Annotation.m. Никогда не стреляли.

- (void)sliderValueChanged:(id)sender{ 
    NSLog(@"state changed"); 
} 

Тем не менее, пытаясь понять, как я могу заставить его стрелять sliderValueChanged в моей аннотации, но не совсем уверен, что если Im на трассе.

Если кто-нибудь более опытный может привести меня, это было бы весьма полезно :).

+0

Вы решили его? пожалуйста, примите ответ, если это поможет. – calimarkus

ответ

0

Как правило, ваш подход к делегатам является правильным. Но, возможно, вы хотите прослушать множество объектов при одном и том же изменении значения (ползунка). Поэтому, вероятно, более удобно просто отправить глобальное уведомление. Посмотрите на:

NSNotificationCenter и NSNotification.

Но если вы хотите придерживаться своего подхода к делегатам. Я не вижу реальной ошибки в коде, который вы указали. Ваше определение протокола здесь не идеальное. Вы забыли тип (id) для вашего параметра. Но это не проблема, я думаю. Также ваше имущество не напечатано как id <TimeSliderDelegate>. Вы забыли синтезировать свойство?

+0

MKAnnotation - всего лишь пример, я планирую делегировать его Overlays, NSObjects и т. Д. Я хочу, чтобы те реагировали как факт, так как UISlider начинает перетаскивать – sherkal

+0

в порядке. обновил мой ответ. – calimarkus

+0

пропустил '(id)', который мог бы быть, попробуем это! – sherkal

1

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

[self.parentViewController setDelegate:self]; 

Кроме того, при вызове делегатов вы должны проверить, существуют ли они в первую очередь в mainViewController.m.

- (IBAction)timeSliderValueChanged:(id)sender { 
    if ([delegate respondsToSelector:@selector(sliderValueChanged:)) 
     [delegate sliderValueChanged:sender]; 
} 

Я надеюсь, что, по крайней мере, вы указали в правильном направлении.

+0

попробует это, спасибо! – sherkal