2014-07-24 7 views
-1

이 문제로 인해 좌절감을 느낍니다. 위임자가 작동하지 않습니다. 아래 코드 예는 다음과 같습니다. 난 그냥 xib이 응용 프로그램에서 사용하고 있습니다.위임자가 IOS에서 작동하지 않습니다.

//classA.h 파일이 ClassA.h

#import "ClassB.h" 

@interface ClassA : UIViewController<ClassBDelegate> 

//classA.m file 
**ClassA.m** 

-(void)didSuccessPreview:(ClassB *)controller andLog:(NSString *)log{ 
    NSLog(@"%@", log); 
} 

//classB.h file 
**ClassB.h** 

#import <UIKit/UIKit.h> 

@class ClassB; 

@protocol ClassBDelegate <NSObject> 

- (void)didSuccessPreview:(ClassB *)controller andLog:(NSString *)log; 

@end 

@interface ClassB : UIViewController 

@property (weak, nonatomic) id<ClassBDelegate>delegate; 

//classB.m file 
**ClassB.m** 

I add this code below inside view did load 

[self.delegate didSuccessPreview:self andLog:@"zz"]; 

나는 위의 코드와 같은 내 응용 프로그램 내부의 다른 대리자를 가지고 있지만 작동하지만,이 하나가 아닌, 나도 몰라 왜. 내 classA 안에는 단추가 있는데 클래스 B로 이동하면 ClassB에서 viewdidload로 이동하면 대리자가 실행되지 않습니다. .

ClassB viewController = [ClassB new]; 
ClassA delegateStrongRef = [ClassA new] 

viewController.delegate = delegateStrongRef; // <-- you are missing this now; 
// Fixed: the ClassA object must be referenced strongly somewhere else 
// besides the (weak)delegate property, otherwise it will be deallocated. 

(위의 코드는 당신이 ClassB의 인스턴스를 생성하는 부분입니다, 뷰 컨트롤러 그것은 수 있습니다 :

+1

언제 대리인을 설정 하시겠습니까? (즉,'self.delegate = someObject') –

+0

객체를 생성해야합니까? ClassB * test = [ClassB new]와 test.delegate = self를 추가했지만 작동하지 않습니다. – user2749248

+0

프로토콜을 채택한 ClassA의 인스턴스를 만들어야합니다. 그것은'ClassB' 객체의'delegate' 속성에 대한 것입니다. 위의 코드에서'self.delegate'가'nil' (제로)이면 메소드는 실행되지 않습니다! –

답변

0

는 대리인을 지정 위치에 따라, 코드는 다음과 같이해야합니다 AppDelegate 내부, 또 다른 viewController의 구현, 앱의 구조에 따라 다름).

그런 다음 뷰 컨트롤러의 -viewDidload 방법, 당신은 대리인이 같은 방법을 실행 할 수 있습니다 : 당신의 뷰 컨트롤러를 인스턴스화 한 후 어떤 시점에서, 그래서

- (void)viewDidLoad 
{ 
    [self.delegate didSuccessPreview:self andLog:@"zz"]; 
} 

을, 당신은 형식의 개체를 할당해야 ClassA (델리게이트 프로토콜을 채택한 클래스)을 delegate 속성에 추가합니다. 그렇지 않으면 nil이 될 것이고 보내진 메시지는 무시 될 것입니다. 속성 및 객체 유형의 인스턴스 변수는 EDIT (int의, float의 등, 초기화 0, 0.0f를, 등)

를 자동으로 할당하지만, 전무로 초기화되지 않은 : 당신은 ClassA에서 대리자를 지정하는 경우 의 코드는, 그것은 다음과 같습니다

ClassA.m :

- (void) someMethodOfClassA 
{ 
    ClassB viewController = [ClassB new]; 
    viewController.delegate = self; 

    // e.g., Do something with the view controller... 
    [navigationController pushViewController:viewController animated:YES]; 
} 

delegate 속성은 weak 참조 BEF로 정의되어 있기 때문에 ore가 대리자의 메서드를 호출하면 할당이 해제되지 않았고 해당 참조가 nil (NSLog을 사용하거나 중단 점을 설정 함)으로 다시 설정되었는지 확인합니다.

관련 문제