我不是 Objective-C 的高手,并且在 Javascript 中做一些简单的事情(创建和绑定(bind)监听器)时遇到一些问题......只是不知道如何在 Objective-C 中做到这一点。
所以我有一个 UISlider。每当用户开始拖动它时,我想从一个对象(在本例中是 MKAnnotation,但任何 NSObject、 Controller 等都需要能够监听)触发 X 函数。
为此使用委托(delegate)是否正确?我尝试过但没有成功:.
在我的 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 绑定(bind)到此(尝试使用 [self delegate] 和 [sender delegate] 没有结果..):
- (IBAction)timeSliderValueChanged:(id)sender {
[delegate sliderValueChanged:sender];
}
它在这里崩溃,说找不到委托(delegate)实例的选择器 sliderValueChanged...我仍然会详细说明其余的代码。
我的测试对象是一个 MKAnnotation,我在 ViewController 内的 MKMapView 中添加了它,这里没什么特别的,我只是像这样添加它。
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,但不完全确定我是否在轨道上。
如果有更有经验的人可以指导我,我将不胜感激:)。
最佳答案
看起来你还没有告诉 mainViewController Annotation 是委托(delegate)。我的猜测是,您必须在 Annotation.m 中包含类似以下内容。
[self.parentViewController setDelegate:self];
此外,在调用委托(delegate)时,您应该首先检查它们是否存在于您的 mainViewController.m 中。
- (IBAction)timeSliderValueChanged:(id)sender {
if ( [delegate respondsToSelector:@selector(sliderValueChanged:) )
[delegate sliderValueChanged:sender];
}
我希望这至少能让你指明正确的方向。
关于iphone - UISlider 委托(delegate)/绑定(bind)到另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9934406/