2012-06-11 2 views
3

뭔가가 누락되었습니다. 이 코드는 정상적으로 작동하지만 모든 컴파일러 경고를 지우고 싶습니다. 이 경우에 나는 UINavigationControllerDelegate에 대한 참조가 왜 아무 생각이 충분하고 공정 - 과거의 경험에서컴파일러에서 UIImagePickerControllerDelegate 프로토콜 준수 여부 확인

Sending 'GSBBuilderImageButton *const __strong' to parameter of incompatible type 'id<UINavigationControllerDelegate,UIImagePickerControllerDelegate>' 

이 경고 메시지와 함께, 나는 프로토콜이 경고에 언급 된 몰랐는데.

그러나 여기 내 인터페이스가 처음이다 : 중요한 것은

#import <UIKit/UIKit.h> 
#import "GSBImageButtonDelegate.h" 

@interface GSBBuilderImageButton : UIButton <UIImagePickerControllerDelegate> 
{ 
    UIPopoverController *popover; 
    UIImage *imageData; 
    NSURL *mediaURL; 
    id <GSBBuilderImageButtonDelegate> _delegate; 
} 
@property (strong, nonatomic) NSURL *mediaURL; 
@property (strong, nonatomic) UIImage *imageData; 
@property (strong, nonatomic) id <GSBBuilderImageButtonDelegate> delegate; 
- (void)removePicture; 
- (void)setImageData:(UIImage *)theImageData; 

@end 

는 UIImagePickerControllerDelegate 채택을 포함 @interface 선언이다. 내 구현

이상 나는 터치에주의 (: forAction : forControlState을 : 나는 내가 setTarget를 사용하지 않는 한이 쓴시에 생각이 클래스는 UIView의 삶 시작했기 때문에) :

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // really need to check to see that the touch ended while within our bounds 

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 

    [imagePicker setSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; 
    [imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary]; 
    [imagePicker setDelegate:self]; 

그래서 내가 읽은 방식은 로컬 객체 인 imagePicker에 위임자가 인터페이스의 GSBBuilderImageButton 인스턴스가 UIImagePickerControllerDelegate 프로토콜을 따르고 있음을 알리는 것입니다. 그것은 완벽하게 유효하며 우리가 항상하는 것처럼 보입니다. 내 GSBBuilderImageButton에 자체 대리인이 있다는 것은 사실이지만 잘못 입력하지 않으면이 점을 감안하면 안됩니다.

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     [[self imageView] setContentMode:UIViewContentModeScaleAspectFill]; 
     UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(removePicture)]; 
     [self addGestureRecognizer:longPress]; 
    } 
    return self; 
} 
: 완성도, 여기에 내가 사용하고 초기화 그래서

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

내가 프로그래밍 방식으로이 버튼을 짓고 있어요 선택 의정서 방식의 구현을 포함, 물론, 그 이후 더있다

(참고 : setImageData ... 내 정의에 신경 쓰지 마세요. UIButton의 setImage를 호출하는 래퍼 메소드이며 몇 가지 다른 작업이 있으며 유산은이 UIView의 유산입니다.이 앱의 버전 2.0 setImage를 오버라이드합니다 :

답변

13

그것은 그냥 경고 메시지의 말씀 : UIImagePickerController's delegate property모두UIImagePickerControllerDelegateUINavigationControllerDelegate 프로토콜을 준수하는 객체를 기대하고있다. 이는 이미지 픽커 UI가 네비게이션 컨트롤러를 포함하기 때문입니다. 이 프로토콜의 메소드는 선택 사항이므로 아무 것도하지 않아도 구현할 필요가 없습니다.

하지만 당신은 여전히 ​​두 프로토콜 준수를 선언 할 필요가 않습니다

@interface GSBBuilderImageButton : UIButton <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 

코드의 나머지는 컴파일러 경고 무관하다.


업데이트 : 여기에 관련된 팁입니다. 클래스의 구현 내에서만 프로토콜 준수를 사용하는 경우에는 헤더 파일에 선언을 지정할 필요가 없습니다. 대신 .m 파일의 클래스 확장에서 적합성을 선언 할 수 있습니다.

@interface GSBBuilderImageButton() <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 
@end 
+0

확실히 충분합니다! 고맙습니다! – tobinjim