2013-12-10 1 views
0

저는 User 클래스, 주 뷰 컨트롤러 및 SetUp 컨트롤 뷰어 (두 번째 컨트롤 뷰어)가있는이 프로젝트에서 작업하고 있습니다. User 클래스에는 모든 User 속성이 있으며 기본보기 컨트롤러는 사용자 이름/암호를 만들고 SetUp보기 컨트롤러를 호출하며 SetUp보기 컨트롤러는 사용자가 추가 정보를 입력 할 수있게합니다. 사용자가 두 번째보기 컨트롤러에 추가 정보를 입력 한 후 주보기 컨트롤러에서 대리자 메서드를 호출하는 프로토콜을 SetUp보기 컨트롤러에 만들었습니다. 대리자 메서드는 User 객체를 반환하지만, 이것은 내가 잃어버린 곳입니다. User 객체는 어디에서 반환됩니까? 그것은 확실히 내가 원하는 곳으로 가지 않습니다.대리자 및 프로토콜을 사용하여 개체를 반환하는 방법

/**Main View Controller Implementation**/ 
#import "BWViewController.h" 
#import "User.h" 

@interface BWViewController() 

@end 

@implementation BWViewController 

@synthesize holdPassword,holdUserName,holdZone,holdArea; 

-(IBAction)signUpButton 
{ 

    firstUser = [[User alloc] init]; 
    firstUser.userName = userNameField.text; 
    firstUser.password = passwordField.text; 

    SetUp *setUpView = [[SetUp alloc] initWithNibName:Nil bundle:Nil]; 
    setUpView.delegate = self; 

    User * bufferUser; 

    bufferUser = [self presentViewController:setUpView animated:YES completion:^{ }]; /**This is where I want the User object from the delegate method return to**/ 


} 

/**Delegate method in Main view controller**/ 

-(User*) sendUserInfoBack: (SetUp *) SetUpController didFinishWithZoneInfo:(NSString*)zoneInfo didFinishWithAreaInfo:(NSString*) areaInfo 
{ 

    User*holdUser; 
    holdZone = zoneInfo; 
    holdArea = areaInfo; 

    holdUser.userZone = holdZone; 
    holdUser.userArea = holdArea; 

    return holdUser; /**return this to bufferUser object in method above**/ 
} 

/**Second View controller Interface**/ 
#Import "User.h" 
@class SetUp; 

@protocol SetUpControllerDelegate <NSObject> 

-(User*) sendUserInfoBack: (SetUp *) SetUpController didFinishWithZoneInfo:(NSString*)zoneInfo didFinishWithAreaInfo:(NSString*) areaInfo; 

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

@end 


/**Second View controller implementation**/ 
-(IBAction)goToMainView:(id)sender 
{ 
    NSString * neededZoneStore = Zone.text; 
    NSString * areaStore = Area.text; 

    User * user = [[User alloc] init]; 

    user.userZone = neededZoneStore; 
    user.userArea = neededAreaStore; 

    [self.delegate sendUserInfoBack:self didFinishWithZoneInfo:neededZoneStore didFinishWithAreaInfo:neededAreaStore]; 

    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 
+0

가능한 한 간단하게 무엇을하려고하는지 명확히하려고 할 수 있습니까? – nhgrif

+0

'@protocol SetUpControllerDelegate ' 확실히. SetUp보기 컨트롤러에서 얻은 변수를 사용하여 User 개체를 주보기 컨트롤러의 bufferUser 개체로 반환하려고합니다. – Brosef

답변

2
[self.delegate sendUserInfoBack:self didFinishWithZoneInfo:neededZoneStore 
    didFinishWithAreaInfo:neededAreaStore]; 

그래서, 당신은 아마 다시 위임에 self을 보낼 필요가 없습니다. 위임자는 객체를 인스턴스화 한 이후로 이미 self에 대해 알고 있습니다. 그냥 같이 호출,

-(void)sendUserInfoBack:(User*)user; 

을 한 다음 다시이 정보를 보낼 준비가되었을 때 :

[self.delegate sendUserInfoBack:user]; 

을 지금 위임에

당신이 당신의 프로토콜을 변경해야 클래스에서 프로토콜의 메소드를 구현해야합니다.

-(void)sendUserInfoBack:(User*)user { 
    //do stuff with user 
} 

예를 들어 holdZoneholdArea 재산, 그래서 당신은 다음과 같이하는 방법을 작성할 수 있습니다

-(void)sendUserInfoBack:(User*)user { 
    self.holdZone = user.userZone; 
    self.holdArea = user.userArea; 
    //then perhaps perform a segue, or whatever. 
} 

을 내가 질문을보고 시간을 보내고, 나는 문제가 명확 해지고있다 생각합니다.

이 줄 :

bufferUser = [self presentViewController:setUpView animated:YES completion:^{ }]; 

은 잘못된 것입니다. 델리게이트 메서드 sendUserInfoBack에서 다른 클래스의 정보를 다시 얻습니다. 그리고 다른 클래스를 제외하고는이 메서드를 호출하면 안됩니다.

-(IBAction)signUpButton 메서드는 뷰를 시작한 다음 메서드의 끝 부분에 있어야합니다. 이제이보기 제어기는 대기 상태에 있고 다른보기 (첫 번째보기 제어기가 위임)는 응답을 기다립니다.

새로 시작한보기가 완료되면 자체보기가 닫히고 원래보기에서 sendUserInfoBack이 호출됩니다. 이것이 모달보기가 지워지고 원래보기가 수행 기능을 수행 할 수 있음을 의미합니다.

다른보기를 완료 한 후에 수행하려는 작업은 코드가 sendUserInfoBack 메서드에 배치되어야합니다.


그것은 대리인이 위임 메소드를 구현하지만, 대리인이 메소드를 호출하는 일이 아닌 및 반환 값이 아무것도 할 수 없음을 명심하는 것이 중요합니다. 대리 메서드의 반환 값은 메서드를 호출하는 개체에서 사용됩니다.

예를 들어 UITableView을 구현하는 경우를 고려해보십시오. cellForRowAtIndexPath의 반환 유형은 UITableViewCell입니다. 그러나이 반환 값은 어디에서 받습니까? 너는하지 않는다. 셀이 설정된 방법을 사용자 지정할 수 있도록이 위임 메서드를 재정의합니다. 보기 컨트롤러가 델리게이트 인 UITableView 클래스는이 메서드를 재정의하지만 ... UITableView은 대리자의 메서드를 호출 한 다음 반환 값 (방금 설정 한 셀)을 사용하여 더 많은 작업을 자체적으로 수행합니다.

sendUserInfoBack은 그 값이 반환 된 후에 SetUpControllerDelegate 클래스에서 더 많은 작업을해야하는 경우에만 반환 값을 갖기를 원할 것입니다. 우리가 한 예를 들어

:

- (BOOL)sendUserInfoBack:(User*)user; 

이제 몇 가지 논리를 넣을 수 있습니다,이 메소드를 오버라이드 (override) 대리자 ... 중 YES 또는 NO이 무엇에 따라 반환하고 우리는 그것을 같은 것을 사용합니다 this in SetUpControllerDelegate :

if([self.delegate sendUserInfoBack:user]) { 
    // everything's fine, we can dismiss view 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} else { 
    // everything wasn't fine, we need to try again 
    // pop up a UIAlertView perhaps try to get better info 
} 

이것은 단지 예입니다.

+0

'- (void) sendUserInfoBack : (User *) user;'왜 이것이 무효가됩니까? User 객체를 돌려 주면 안 될까요? – Brosef

+0

방금 ​​내 대답을 업데이트하고 생각을 분명히했습니다. – nhgrif

+0

Ok 두 번째보기 컨트롤러를 호출 한 후 signUpButton 메서드에 다시 착륙 할 수 있는지 여부는 확실하지 않았습니다. 내가 signUpButton 메서드에서 중단했던 곳으로 돌아갈 수 있기를 바랬습니다. – Brosef

관련 문제