Objective c 如何使用委托和协议返回对象
我正在处理这个项目,我有一个用户类、我的主视图控制器和我的设置控件查看器(第二个控件查看器)。用户类具有所有用户属性,主视图控制器创建用户名/密码,然后调用设置视图控制器,设置视图控制器允许用户输入其他信息。在用户在第二个视图控制器中输入附加信息后,我在设置视图控制器中创建了一个协议,该协议在主视图控制器中调用委托方法。委托方法返回一个用户对象,但这就是我丢失的地方。返回的用户对象在哪里?它肯定不会去我想去的地方Objective c 如何使用委托和协议返回对象,objective-c,ios7,Objective C,Ios7,我正在处理这个项目,我有一个用户类、我的主视图控制器和我的设置控件查看器(第二个控件查看器)。用户类具有所有用户属性,主视图控制器创建用户名/密码,然后调用设置视图控制器,设置视图控制器允许用户输入其他信息。在用户在第二个视图控制器中输入附加信息后,我在设置视图控制器中创建了一个协议,该协议在主视图控制器中调用委托方法。委托方法返回一个用户对象,但这就是我丢失的地方。返回的用户对象在哪里?它肯定不会去我想去的地方 /**Main View Controller Implementation**/
/**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];
}
/**主视图控制器实现**/
#导入“BWViewController.h”
#导入“User.h”
@接口BWViewController()
@结束
@视图控制器的实现
@合成holdPassword、holdUserName、holdZone、holdArea;
-(iAction)签名按钮
{
firstUser=[[User alloc]init];
firstUser.userName=userNameField.text;
firstUser.password=passwordField.text;
SetUp*setUpView=[[SetUp alloc]initWithNibName:Nil bundle:Nil];
setUpView.delegate=self;
用户*缓冲用户;
bufferUser=[self-presentViewController:setUpView动画:是完成:^{}];/**这是我希望委托方法中的用户对象返回到的位置**/
}
/**主视图控制器中的委托方法**/
-(用户*)sendUserInfoBack:(设置*)设置控制器完成区域信息:(NSString*)区域信息完成区域信息:(NSString*)区域信息
{
用户*holdUser;
holdZone=zoneInfo;
holdArea=areaInfo;
holdUser.userZone=holdZone;
holdUser.userArea=holdArea;
return holdUser;/**将此返回到上述方法中的bufferUser对象**/
}
/**第二视图控制器接口**/
#导入“User.h”
@班级设置;
@协议设置控制器delegate
-(用户*)sendUserInfoBack:(设置*)设置控制器完成区域信息:(NSString*)区域信息完成区域信息:(NSString*)区域信息;
@属性(弱,非原子)iddelegate;
@结束
/**第二视图控制器实现**/
-(iAction)goToMainView:(id)发件人
{
NSString*neededZoneStore=Zone.text;
NSString*areaStore=Area.text;
用户*User=[[User alloc]init];
user.userZone=neededZoneStore;
user.userArea=neededAreaStore;
[self.delegate sendUserInfoBack:self didFinishWithZoneInfo:NeededZones或didFinishWithAreaInfo:neededAreaStore];
[self-dismissViewControllerAnimated:是完成:空];
}
因此,您可能永远不需要将self
发送回代理。由于代理实例化了一个对象,因此该代理已经知道了有关self
您需要将协议更改为:
-(void)sendUserInfoBack:(User*)user;
然后,当您准备将此信息发送回时,您只需这样称呼它:
[self.delegate sendUserInfoBack:user];
-(void)sendUserInfoBack:(User*)user {
self.holdZone = user.userZone;
self.holdArea = user.userArea;
//then perhaps perform a segue, or whatever.
}
现在在delegate类中,您需要实现协议中的方法:
-(void)sendUserInfoBack:(User*)user {
//do stuff with user
}
例如,您有一个holdZone
和holdArea
属性,因此您可以编写如下所示的方法:
[self.delegate sendUserInfoBack:user];
-(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
。除了从另一个类调用外,不应该调用此方法
您的-(iAction)signUpButton
方法应该启动视图,然后该方法应该结束。现在,这个视图控制器只是处于待机状态,而另一个视图(第一个视图控制器正在委派)则等待其响应
当新启动的视图完成时,它会自动关闭,并在原始视图上调用sendUserInfoBack
。这就是为什么您知道模态视图被清除,并且原始视图可以继续执行功能
因此,在另一个视图完成后要执行的任何操作,都应该将该代码放在sendUserInfoBack
方法中
请务必记住,尽管委托实现了委托方法,但委托不是调用方法的人,并且不能对返回值执行任何操作。委托方法的返回值将由调用该方法的对象使用
例如,在执行<代码> UITabeVIEW时考虑。
cellforrowatinexpath
有一个返回类型:UITableViewCell
。但是你从哪里得到这个返回值呢?你没有。可以重写此委托方法,以便自定义单元格的设置方式。视图控制器是其委托的UITableView
类重写此方法。。。但是,UITableView
对其委托调用该方法,然后使用返回值(它刚刚设置的单元格)自己做更多的工作
如果在返回值之后需要在SetUpControllerDelegate
类中执行更多工作,则只希望您的sendUserInfoBack
具有返回值
例如,如果我们这样做了:
- (BOOL)sendUserInfoBack:(User*)user;
现在,重写此方法的委托可以放入一些逻辑以返回YES
或NO
,具体取决于。。。然后我们会在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
}
这只是一个例子。你能尽可能简单地澄清你想做什么吗?
@protocol SetUpControllerDelegate
当然。我正在尝试将带有在设置视图控制器中获得的变量的用户对象返回到主视图控制器中的bufferUser对象中。-(void)sendUserInfoBack:(User*)User代码>为什么返回的是无效的?我们不应该返回一个用户对象吗?我刚刚更新了我的答案,我想增加了一些清晰度。好的,我不确定调用第二个视图控制器后是否可以再次进入signUpButton方法。我希望我