2012-05-20 4 views
1

Я пытаюсь использовать делегирование между двумя Viewcontrollers, но, к сожалению, мой делегат не запускается. Надеюсь, кто-то может помочь мне исправить эту проблему. У меня есть ViewContoller, называемый MapBackgroundViewController, и один называется MapsViewController. При изменении параметра SegmentedControl в MapsBackgroundViewController необходимо информировать MapsViewController. (я на самом деле пытаюсь реализовать что-то вроде карт приложения на iPhone с подданным завитком)Делегат не отвечает

Вот часть моего кода:

MapBackgroundViewController.h

@protocol ChangeMapTyp <NSObject> 
@required 
- (void)segmentedControllChangedMapType:(MKMapType) type ; 
@end 


@interface MapBackgroundViewController : UIViewController{ 
IBOutlet UISegmentedControl *segmentedControl; 
MKMapType mapType; 
id < ChangeMapTyp> delegate; 

} 


@property IBOutlet UISegmentedControl *segmentedControl; 

@property MKMapType mapType; 

@property(strong)id delegate; 

- (IBAction)segmentedControllChanged:(id)sender; 

MapBackgroundViewController.m

@interface MapBackgroundViewController() 

@end 

@implementation MapBackgroundViewController 
@synthesize segmentedControl, mapType, delegate; 


- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 

[self setDelegate:self]; 

NSLog(@"%@",self.delegate); 

} 


- (IBAction)segmentedControllChanged:(id)sender { 

if (segmentedControl.selectedSegmentIndex == 0) { 
    mapType = MKMapTypeStandard; 
}else if (segmentedControl.selectedSegmentIndex == 1) { 
    mapType = MKMapTypeSatellite; 
} else if (segmentedControl.selectedSegmentIndex == 2) { 
// [self.delegate setMapType:MKMapTypeHybrid]; 
    mapType = MKMapTypeHybrid; 
} 


//Is anyone listening 

NSLog(@"%@",self.delegate); 

if([self.delegate respondsToSelector:@selector(segmentedControllChangedMapType:)]) 
{ 
    //send the delegate function with the amount entered by the user 
    [self.delegate segmentedControllChangedMapType:mapType]; 
} 

[self dismissModalViewControllerAnimated:YES]; 

} 

MapsViewController.h

#import "MapBackgroundViewController.h" 

@class MapBackgroundViewController; 

@interface MapsViewController : UIViewController<MKMapViewDelegate, 
UISearchBarDelegate, ChangeMapTyp >{ 
IBOutlet MKMapView *map; 
} 


@property (nonatomic, retain) IBOutlet MKMapView *map; 


@end 

MapsViewController.m (метод ниже по какой-то причине не получает и не называют)

- (void)segmentedControllChangedMapType: (MKMapType) type{ 
    map.mapType = type; 
} 

ответ

6

В MapBackgroundViewController вы установили delegate свойство self, поэтому делегат self - (MapBackgroundViewController), поэтому при выполнении проверьте if([self.delegate respondsToSelector:@selector(segmentedControllChangedMapType:)]), он возвращает NO, потому что self.delegate (то есть self, то есть MapBackgroundViewController), не реализует этот метод. Если вы хотите, чтобы ваш MapsViewController был делегатом, в вашем MapBackgroundViewController у вас должен быть экземпляр MapsViewController (например, myMapsViewController), а затем установите self.delegate = myMapsViewController.

+1

+1 что и никогда не используйте 'strong' /' retain' в свойстве делегата, так как при этом вы будете удерживать цикл сохранения. – Till

+0

@ Будет очень правильным. – graver

+0

ах ок, спасибо. Я вижу проблему. Я действительно ценю твою помощь. Но если я попытаюсь сделать что-то вроде: MapsViewController myMapsViewController = [MapsViewController alloc] init]; Я должен #import мой MapsViewController в MapBackgroundViewController.h (или .m). НО, если я #import его, я получаю сообщение об ошибке: «не удается найти объявление протокола для changeMapTyp» в MapsViewController.h. Кто-нибудь знает, почему это так? – Kito