2013-12-10 89 views
0

我正在研究這個項目,我有一個用戶類,我的主視圖控制器和我的SetUp控制查看器(第二個控制查看器)。 User類具有所有的User屬性,主視圖控制器創建用戶名/密碼,然後調用SetUp視圖控制器,SetUp視圖控制器允許用戶輸入其他信息。我在SetUp視圖控制器中創建了一個協議,在用戶在第二個視圖控制器中輸入附加信息後,在我的主視圖控制器中調用委託方法。委託方法返回一個用戶對象,但這是我迷路的地方。 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 ' 當然。我試圖返回一個用戶對象與設置視圖控制器中獲得的變量到我的主視圖控制器中的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方法中。


重要的是要記住,雖然委託實現的委託方法,委託是不是一個調用的方法和不能做的返回值什麼是很重要的。調用方法的對象將使用委託方法的返回值。

例如,考慮您何時實施UITableViewcellForRowAtIndexPath有一個返回類型:UITableViewCell。但是,你在哪裏收到這個回報值?你沒有。您重寫此委託方法,以便您可以自定義單元格的設置方式。 UITableView類,您的視圖控制器是一個委託,將覆蓋此方法...但UITableView在其委託上調用方法,然後使用返回值(它剛剛設置的單元格)自行完成更多工作。

如果您需要在返回值後在SetUpControllerDelegate類中執行更多工作,則只希望sendUserInfoBack具有返回值。

例如,如果我們這樣做:

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

現在重寫此方法可以把一些邏輯委託返回要麼YESNO取決於什麼......然後我們會使用它像這在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;'爲什麼這個返回void?我們不應該返回一個用戶對象嗎? – Brosef

+0

我剛剛更新了我的答案,我想補充一些清晰度。 – nhgrif

+0

好吧我不確定我們是否可以在調用第二個視圖控制器後再次登陸signUpButton方法。我希望能夠在signUpButton方法中返回我離開的地方。 – Brosef