iphone - UISlider 委托(delegate)/绑定(bind)到另一个对象?

标签 iphone objective-c ios xcode ipad

我不是 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/

相关文章:

ios - 如果 objective-c 的 uitableview 中没有新行,如何停止滚动 uitableview?

iOS - 删除 UITabBarViewController 阴影

iphone - 警告 : Attempt to present <CustomViewController> on <UINavigationontroller> whose view is not in the window hierarchy

iphone - - (void)add<名称>对象 : function

ios - 如何在继续之前强制用户与 UIView 交互?

iphone - MPMediaPickerController 选择歌曲不播放

objective-c - Xcode 6 中未创建 Swift 到 Objective-C header

ios - 如何控制多个同名的 Sprite 套件节点?

ios - [project] 的 Xcode Capabilities 警告可能无法正常运行,因为它的权利使用占位符团队 ID

ios - 如何从详细 View Controller 中的选定单元格获取 cell.textLabel.text?