2012-03-21 2 views
0

위임자와 프로토콜을 통해 문자열을 전달합니다. 문자열은 클래스에 올바르게 수신되지만 viewDidLoad 메서드가 호출 된 후에 발생합니다. viewDidLoad 메서드에는 전달 된 문자열이 필요합니다.iPhone 프로토콜 대리인 전달 데이터

viewDidLoad 전에 대리자 메서드를 호출하기 위해 수행 할 수있는 작업에 대한 아이디어가 있습니까? 나는 이것이 위임자/프로토콜 데이터 전달의 아이디어라고 생각했다. 새로운 뷰가 생성되어 푸시

방법 : ViewControllerTwo에서

ViewControllerTwo *two = [[ViewControllerTwo alloc] initWithNibName:@"ViewControllerTwo" bundle:nil]; 
two.delegate = self; 
[two setString:theString]; 
[self.navigationController pushViewController:two animated:YES]; 
[two release]; 

:

- (void)setString:(NSString *)str 
{ 
    self.myString = str; 
} 

편집 : 입력 해 주셔서 감사합니다. 그러나 init 메서드를 통해이 데이터를 전달하는 방법을 알고 있습니다. 나는 프로토콜과 대표자를 최근에 테스트 해왔고, 이것을 할 방법이 있는지 알고 싶었습니다. 나는 다른 클래스에서 이와 같은 데이터를 성공적으로 통과했으며 성공했다. 프로토콜 메서드는 먼저 문자열을 설정하기 위해 호출되었습니다. 그것은 지나가는 데이터를 처리하는 훨씬 더 깨끗한 방법처럼 보였습니다.

+0

나는 내 질문을 편집했습니다. 위임을 통해이 작업이 가능한지 또는 다른 작업에서이 작업을 수행하기 때문에 내가 잘못하고있는 작업을보고 싶습니다. 대리자 메서드는 init 및 viewDidLoad보다 먼저 호출됩니다. – Vikings

답변

1

Delegation이 사용되는 이유와 이유에 대해 약간 혼란 스러울 것 같아요.

예를 들어, ViewController에서 어떤 종류의 동작을 수행하고 있고 다른 동작을 수행하고 있다는 것을 다른 하위 클래스에 알릴 필요가 있다면 UIViewController 하위 클래스에서 프로토콜을 만들 수 있습니다.

이제 작업 (수신기)에 대해 알고 싶어하는 하위 클래스의 경우 헤더 파일의 해당 프로토콜을 준수해야합니다.

또한 delegatereceiving class/controller으로 "설정"해야합니다.

에 대한 참조를 delegate으로 설정하는 방법은 여러 가지가 있지만 공통적 인 실수는 해당 클래스가 이미 생성되었을 때 해당 클래스의 새 인스턴스를 할당 및 초기화하여 해당 클래스를 위임자로 설정하는 것입니다. 그러면 새로 생성 된 클래스가 이미 생성되고 메시지를 기다리는 대신에 델리게이트로 설정됩니다.

당신이하려는 것은 새로 생성 된 클래스에 값을 전달하는 것입니다. 이 UIViewController 클래스를 만드는 것만으로도 해당 요소가 receiver(ViewControllerTwo)의 Property입니다. 귀하의 경우에는

NSString :

@Property (nonatiomic, retain) NSString *string; //goes in ViewControllerTwo.h 

물론 메인에 잊지 마세요 :

@synthesize string; //Goes in ViewControllerTwo.m 

는 이제 ViewControllerTwo의 세터에 대한 필요가 없습니다. 당신이 @synthesize를 사용할 때

- (void)setString:(NSString *)str //This Method can be erased 
    {         //The setter is created for free 
     self.myString = str;   // when you synthesized the property 
    } 

세터와 게터는 무료입니다. 값을 ViewController으로 전달하십시오. 구현은 위임자를 제외하고 코드와 동일합니다.

ViewControllerTwo *two = [[ViewControllerTwo alloc] initWithNibName:@"ViewControllerTwo" bundle:nil]; 
    [two setString:theString]; 
    [self.navigationController pushViewController:two animated:YES]; 
    [two release]; 
0

초기화 단계에서 해당 문자열을 전달해야하는 경우 init 메소드에서 전달할 수 있습니다.

그래서 컨트롤러에이 같은 속성 및 추가 init 메소드를 작성해야

.H

@property (nonatomic, copy) NSString* myString; 

-(id)initWithString:(NSString*)theString; 

가하는 .m

@synthesize myString; 

-(id)initWithString:(NSString*)theString { 
    self = [super initWithNibName:@"ViewController" bundle:nil]; // I prefer to set the name of the controller internally 
    if(self) { 
     myString = [theString copy]; 
    } 
    return self; 
} 

다음, self.myString를 사용을 곳을 필요.

ARC를 사용하지 않는 경우 반드시 해제해야합니다.

- (void)dealloc 
{ 
    [myString release]; 
    [super dealloc]; 
} 
0

당신은 ViewControllerTwo, 예를 들어,에 대한 사용자 지정 초기화를 만들 수 ViewControllerOne에서

- (id)initWithString:(NSString *)aString; 
{ 
    self = [super initWithNibName:@"ViewControllerTwo" bundle:nil]; 
    if(!self) return nil; 

    self.myString = aString; 
    // other initialization 

    return self; 
} 

당신의 초기화는 다음과 같습니다

ViewControllerTwo *vc = [[ViewControllerTwo alloc] initWithString:theString]; 
[[self navigationController] pushViewController:vc animated:YES]; 
[vc release]; 
0

내가 이것에 대한 프로토콜을 사용하지 않을 것입니다. 부모보기 컨트롤러에서 자식으로 데이터를 전달하려면 사용자 정의 초기화 메서드를 사용하십시오. ViewControllerTwo.h에서

:

-(id)initWithString:(NSString *)str; 

다음 ViewControllerTwo.m에서 그 구현 :

-(id)initWithString:(NSString *)str { 
    self = [super self]; 
    if(self) { 
     self.myString = str; 
    } 
    return self; 

을 그리고 당신의 ViewController 하나에 그 전화 :

ViewControllerTwo *two = [[ViewControllerTwo alloc] initWithString:@"Cool String"]; 
0

사용자가 u없이 앞뒤로 전환 할 수 있기 때문에 init 메소드 또는 viewDidLoad에 데이터 배치가 작동하지 않습니다. 뷰를 언로드하거나 뷰 컨트롤러를 다시 초기화하십시오.

변화하는 데이터를 검색하는 가장 좋은 장소는 viewWillAppear 컨트롤러 메소드입니다.그러면 사용자가 전환 할 때마다 데이터가 업데이트됩니다.

또 다른 좋은 방법은 MVC 아키텍처를 사용하는 것입니다. 데이터를 보유 할 별도의 모델 클래스가있는 경우 컨트롤러에서 쓰기/업데이트 할 수 있습니다.

+0

dealloc 메소드가 호출되어로드 될 때마다 뷰가 작성되고 데이터가 올바르게 전달됩니다. – Vikings

+0

MVC가 단 하나의 객체가 전달되기 때문에 MVC를 사용하고 싶지 않습니다. 내 프로젝트에 잔인한 것처럼 보입니다. – Vikings

관련 문제