我不是Objective-C的主人,我在Javascript(创建和绑定一个监听器)中做一些简单的事情有些问题......只是想弄清楚如何在Objective-C中做到这一点。
所以我有一个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绑定到此(尝试使用 [self delegate]和[sender delegate] 而没有结果..):
- (IBAction)timeSliderValueChanged:(id)sender {
[delegate sliderValueChanged:sender];
}
它在这里崩溃了,说找不到委托实例的选择器sliderValueChanged ......我仍然会详细说明我的其余代码。
我的测试对象是一个MKAnnotation,我在我的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;
最后,这是我在Annotation.m中的代码。永远不会被解雇。
- (void)sliderValueChanged:(id)sender{
NSLog(@"state changed");
}
仍在试图弄清楚如何在我的注释中触发sliderValueChanged,但不能完全确定我是否在赛道上。
如果有经验的人可以带领我,那将非常感激:)。
答案 0 :(得分:1)
看起来你没有告诉mainViewController,Annotation是委托。我的猜测是你必须在Annotation.m中包含类似下面的内容。
[self.parentViewController setDelegate:self];
此外,在调用委托时,您应该先检查它们是否存在于mainViewController.m中。
- (IBAction)timeSliderValueChanged:(id)sender {
if ( [delegate respondsToSelector:@selector(sliderValueChanged:) )
[delegate sliderValueChanged:sender];
}
我希望至少让你指出正确的方向。
答案 1 :(得分:0)
一般来说,您的委托方法是正确的。但是你可能想要在(滑块的)相同值变化上听多个对象。因此,发送全局通知可能更方便。看看:
NSNotificationCenter
和NSNotification
。
但是如果你想坚持你的代表方法。我无法在您提供的代码中看到真正的错误。您的协议定义在这里并不完美。您忘记了参数的类型(id)
。但那不是我想的问题。此外,您的媒体资源也未输入为id <TimeSliderDelegate>
。
你忘了合成这个属性吗?