2013-07-16 5 views
-2

궁극적으로 ALAssetsLibrary를 통합 한 iOS 앱을 작성하려고하지만 위임을 이해하기위한 첫 번째 단계로 두 개의보기 컨트롤러간에 간단한 메시지를 전달하려고합니다. 웬일인지, 나는 메시지를 건네 줄 수 없다. 특히 델리게이트 객체 (derpy)가 존재하지 않는 것 같습니다 (if(self.derpy)NO을 반환합니다).대리자 개체가 메서드 호출에 응답하지 않는 이유는 무엇입니까?

나는 Apple 포럼에서 같은 질문을하고 대신에 segues를 사용하고 self.child를 사용하여 속성/호출 방법을 설정해야한다고 들었지만 이상하게 보입니다. 부모/자식 속성을 사용하여 메시지를 전달할 경우 Interface Builder에서 내보기를 만들 수 있습니까? UINavigationController 내부에서 내 두 가지 뷰를 설정하고 나면 실제로 "연결"하는 방법을 모르므로 메시지를 전달할 수 있습니다. 질문이 지나치게 광범위하면 죄송합니다.

인터페이스 :

#import <UIKit/UIKit.h> 
#import <AssetsLibrary/AssetsLibrary.h> 

@protocol DerpDelegate <NSObject> 
@required 
- (void) test; 
@end 

@interface PickerViewController : UIViewController 

@property (nonatomic, assign) id<DerpDelegate> derpy; 

@end 

구현 :

#import "PickerViewController.h" 

    @interface PickerViewController() 
    @end 

    @implementation PickerViewController 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad];  
     if (self.derpy) {   // If the delegate object exists 
      [self.derpy test]; // send it this message 
     } else { 
      NSLog(@"Still not working.");  // This always returns (i.e., self.derpy doesn't exist) 
     } 
    } 

위임 컨트롤러 (MainViewController) 인터페이스 :

여기

내가 (전화 PickerViewController)에서 프로토콜을 선언하고있어 컨트롤러의
#import <UIKit/UIKit.h> 
#import "PickerViewController.h" 

@interface MainViewController : UIViewController <DerpDelegate> // public promise to implement delegate methods 
@property (strong, nonatomic) PickerViewController *picker; 

- (void) test; 

@end 

그리고 마지막으로, 대리인 컨트롤러 (MainViewController) 구현 :

#import "MainViewController.h" 
#import "PickerViewController.h" 

@interface MainViewController() 
@end 

@implementation MainViewController 

// Here's that method I promised I'd implement 

- (void) test{ 
    NSLog(@"Test worked.");  // This never gets called 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.picker.derpy = self; 

//lazy instantiation 
- (PickerViewController *) picker{ 
if(!_picker) _picker = [[PickerViewController alloc]init]; 
return _picker; 
} 

편집 : 많은 감사 self.picker.derpy = self와 함께 올바른 방향으로 날을 가리키는 위해 rydgaze,하지만 어떤 이유로, 상황이 여전히 제대로 작동하지 않습니다. 중요하게, 해당 속성이 설정되면 if(self.picker.derpy)은 MainViewController에서 YES을 반환합니다. 그러나 if(self.derpy)은 PickerViewController의 viewDidLoad 내부에서 호출 할 때 여전히 NO을 반환합니다. 재산은 어떻게 존재할 수 있으며 동시에 존재할 수 없습니까?

+0

을 내 꺾쇠 괄호가 표시되지 않는 몇 가지 이유. 어떻게 든 그들을 벗어날 필요가 있습니까? – jefflovejapan

+0

코드를 선택한 코드 형식 버튼 만 사용하십시오. 왜이 모든 무료 전화가 있죠? – vikingosegundo

+0

(코드 형식 버튼은 텍스트 입력 화면 위의'{} '버튼입니다. 코드를 강조 표시하고 해당 버튼을 누르십시오.) –

답변

2

화면에 두는보기 컨트롤러 인스턴스에 위임자를 설정해야합니다. 당신이 탐색 컨트롤러를 사용하고 MainViewController 및 PickerViewController 사이에 이동 segues하는 경우에, 당신은 prepareForSegue에 위임을 설정해야합니다

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    self.picker = (PickerViewController *)segue.destinationViewController; 
    self.picker.derpy = self; 
} 
+0

정말 고마워요! – jefflovejapan

1

먼저 델리게이트를 채워야합니다. PickerViewController에서 위임 화재가 콜백이 일어날 때

는 기본적으로 somepoint에서 당신의 MainViewController의 shoudl는 그런 다음

picker.derpy = self;

을한다.

편집 : 좋은 방법은 당신이 MainViewController

의 구현에

@interface MainViewController : UIViewController<DerpDelegate> 

결국 대리자를 구현하는 것을 나타냅니다 PickerViewController

@property (nonatomic, assign) id<DerpDelegate > derpy; 

에 당신의 MainViewController에서 같은 일을하는 것입니다

같은 것을 갖습니다.
picker = [[PickerViewController alloc]init]; 
picker.derpy = self; 
[picker doYourThing]; 

일단 선택 도구가 모두 완료되면 위임자를 사용하여 결과를 반환 할 수 있습니다.

+0

이것은 훌륭하지만 어떤 이유로 메시지가 여전히 전달되지 않습니다. 비판적으로, (self.picker.derpy) MainViewController 내부에서 YES를 반환하지만, (self.derpy)가 PickerViewController 내부에서 NO를 반환하는 경우. 왜 그렇게 될지 아십니까? – jefflovejapan

+0

위임이 정확히 무엇을하는지 이해하는 것이 도움이 될 것이라고 생각합니다. 대리자는 본질적으로 메시지를 보내는 객체에 대한 포인터입니다 (함수 호출). 개체 (대리자)가 채워져 있지 않으면 함수를 호출 할 수 없습니다. 다음 링크를 참조하십시오. http://alexefish.com/post/15966868557/understanding-and-creating-delegates-in-objective-c – rydgaze

관련 문제