2012-05-20 5 views
1

두 개의 ViewController간에 위임을 사용하려고하지만 불행히도 내 대리자가 해고되지 않습니다. 누군가가 내가 문제를 해결하도록 도울 수 있기를 바랍니다. MapViewViewController라는 ViewContoller와 MapsViewController라는 ViewContoller가 있습니다. MapsBackgroundViewController의 SegmentedControl이 변경되면 MapsViewController에 알려야합니다.대리자가 응답하지 않습니다.

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]; 

} 
:

여기

내 코드의 일부입니다 (사실 patrial 컬 아이폰의지도 응용 프로그램 같은 것을 구현하려고)

MapsViewController.h

,515,

MapsViewController.m는 selfdelegate 속성을 설정 한 MapBackgroundViewController에서 (몇 가지 이유가 호출되지 도착을 위해 아래의 방법)

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

답변

6

, 대리자 self 그래서 - 당신이 수행 그렇게 할 때 (MapBackgroundViewController) if([self.delegate respondsToSelector:@selector(segmentedControllChangedMapType:)])을 확인하면 self.delegate (self, 즉 MapBackgroundViewController)이이 메서드를 구현하지 않으므로 NO을 반환합니다. MapsViewController을 대리인으로 지정하려면 MapBackgroundViewControllerMapsViewController (예 : myMapsViewController) 인스턴스가 있어야하며 self.delegate = myMapsViewController을 설정해야합니다.

+1

+1 그렇게 할 때 보유주기를 렌더링하므로 위임 속성에서'strong' /'retain'을 사용하지 마십시오. – Till

+0

@Till은 매우 정확합니다. – graver

+0

아, 감사합니다. 나는 그 문제를 안다. 도와 주셔서 정말 고맙습니다. 하지만 다음과 같이하려고하면 MapsViewController myMapsViewController = [MapsViewController alloc] init]; MapBackgroundViewController.h (또는 .m)에서 # Maps My MapsViewController를 사용해야합니다. 하지만 # import하면 MapsViewController.h에서 "changeMapTyp에 대한 프로토콜 선언을 찾을 수 없습니다."라는 오류 메시지가 나타납니다. 그 이유를 아는 사람이 있습니까? – Kito