2013-12-10 50 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