如何使用协议

我有两个viewControllers

  • 服务提供者
  • 工作地点

ServiceProvider我有一个文本字段和一个selectbutton。 当用户点击selectbutton时,它将redirect到具有location列表的WorkLocation 。 当用户select任何location ,然后点击WorkLocationselectbutton时,它将redirect到带有locationNameId ServiceProvider页面。 在ServiceProvider页面中, locationName将显示在已经存在的文本字段中。

要执行此操作,我正在使用一个协议。

WorkLocation声明:

  #import <UIKit/UIKit.h> #import "WorkDetailCell.h" @protocol WorkLocationDetailViewDelegate <NSObject> @required -(void)organizationInfo:(NSString *) organization_id name:(NSString *)name; @end @interface WorkLocationDetailsViewController :UIViewController < UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate > { IBOutlet UITableView *workLocationTableView; IBOutlet UISearchBar *workLocationSearchBar; NSMutableArray *workDetailArray,*tempDataArray,*searchArray,*searchResultArray; BOOL search; } @property (nonatomic,retain) id < WorkLocationDetailViewDelegate > delegate; 

WorkLocation实现:

  -(IBAction)doneButtonClicked:(id)sender { if (search==FALSE) { NSLog(@"pick%d",[sender tag]); NSLog(@"pick from temp"); NSDictionary *detailList=[tempDataArray objectAtIndex:[sender tag]]; [_delegate organizationInfo:detailList[@"organizationId"] name:detailList[@"organizationName"]]; } else { NSLog(@"pick from search"); } [self.navigationController popToRootViewControllerAnimated:YES]; } 

并在ServiceProvider实现文件中:

 -(void)organizationInfo:(NSString*)organization_id name:(NSString *)name { NSString *id=organization_id; txtWorkLocation.text=name; NSLog(@"%@ %@",organization_id,name); } 

现在,当我从WorkLocation页面返回时,不会调用此方法。 ServiceProvider声明:

 #import "WorkLocationDetailsViewController.h" @class RadioButtonView; @class WorkLocationDetailsViewController; @protocol ServiceProviderProfileDelegate <NSObject> @required -(void)setProImages:(UIImage *)img; @end @interface ServiceProviderProfileViewController : UIViewController < UINavigationControllerDelegate, UIImagePickerControllerDelegate, RadioButtonDelegate, WorkLocationDetailViewDelegate > { NSString *gratuityStr,*paymentStr; RadioButtonView *gratuityGroup,*paymentGroup; IBOutlet UILabel *usernameLabel; NSString *gratuitySelection,*receivePayment; WorkLocationDetailsViewController *WorkVC; } 

您必须将ServiceProvider设置为委托:

 [WorkVC setDelegate:self]; 

为什么不使用prepareForSegue:方法来设置目标视图控制器的文本字段? 这将使视图控制器之间的通信以标准的方式进行,同时也减less了您的编码工作量。

总之,你的代码实现协议看起来不错。 您需要检查WorkVC在其委托设置之前启动。