2012-03-29 9 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に、私は結果なしで[自己デリゲート]と[送信者の委任]で試してみました(私のUISliderからこれまでの私のvalueChangedを結合しました。 。):これは、デリゲートのインスタンス用カント検索セレクタsliderValueChangedを言って、ここでクラッシュし

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

...私はまだ私のコードの残りの部分を詳しく説明します。


私のテストオブジェクトが、私は私のViewControllerの内側に私のMKMapViewに追加MKAnnotationあり、ここで変わったことはし私はちょうどこのようにそれを追加していません。

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; 

最後に、これは注釈mのコードです。決して解雇されない。

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

はまだ私はそれが私の注釈でsliderValueChangedを発射が、トラック上のイム場合は完全にわからないように取得する方法を把握しよう。

もっと経験豊富な人が私を導くことができれば、それは非常に高く評価されます:)。

+0

あなたはそれを解決しましたか?それが助けられたら、答えを受け入れてください。 – calimarkus

答えて

0

一般に、代理人のアプローチは正しいです。しかし、(スライダーの)同じ値の変更で多くのオブジェクトを聴きたいと思うかもしれません。ですから、グローバルな通知を送信するほうがおそらくもっと便利です。次をご覧ください:

NSNotificationCenterおよびNSNotification

しかし、あなたが代理人のアプローチに固執したいのであれば。あなたが提供したコードに実際のエラーはありません。あなたのプロトコル定義はここで完璧ではありません。あなたのパラメータにはタイプ(id)を忘れました。しかし、それは私が推測する問題ではありません。またあなたの財産はid <TimeSliderDelegate>とタイプされていません。 プロパティを合成するのを忘れましたか?

+0

MKAnnotationは例にすぎません。オーバーレイ、NSObjectsなどに委譲する予定です。UISliderがファンクションとして反応するようにしてください。 – sherkal

+0

ok。私の答えを更新しました。 – 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

関連する問題