UISlider делегат / привязка к другому объекту? - PullRequest
0 голосов
/ 30 марта 2012

Я не владелец 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 делегат] и [отправитель делегата] без результата ..):

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

Здесь происходит сбой, говоря, что не могу найти селектор sliderValueChanged для экземпляра делегата ... I 'Я все еще буду дорабатывать оставшуюся часть моего кода.


Мой тестовый объект - это 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 в моей аннотации, но не совсем уверен, что я на трассе.я, это было бы очень цениться:).

Ответы [ 2 ]

1 голос
/ 30 марта 2012

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

[self.parentViewController setDelegate:self];

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

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

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

0 голосов
/ 30 марта 2012

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

NSNotificationCenter и NSNotification.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...