我尝试使用委托但没有成功,代理人没有被调用。 这是我的委托代码:
设置委托(ViewControllerB)
@class SearchGardenTable;
@protocol SearchGardenDelegate <NSObject>
- (void)addItemViewController:(SearchGardenTable *)controller didFinishWithGardenID:(NSString *)gardenID gardenName:(NSString*)gardenName andCityName:(NSString*)cityName;
@end
@interface SearchGardenTable : UITableViewController
@property (nonatomic, weak) id <SearchGardenDelegate> delegate;
@end
告诉VC B VC A是其代表:
// in VC A viewDidLoad.
self.searchGarden = [[SearchGardenTable alloc]init];
[self.searchGarden setDelegate:self];
VC A采用协议
@interface AddKid () <MZFormSheetBackgroundWindowDelegate,SearchGardenDelegate>
@end
@implementation AddKid
设置我想要从VC B传回VC A的参数:
_kidGaedenID = [temp objectAtIndex:indexPath.row];
_kidGardenName = [temp1 objectAtIndex:indexPath.row];
[self.delegate addItemViewController:self didFinishWithGardenID:_kidGaedenID gardenName:_kidGardenName andCityName:_kidCityName];
在VC A实施协议方法:
- (void)addItemViewController:(SearchGardenTable *)controller didFinishWithGardenID:(NSString *)gardenID gardenName:(NSString*)gardenName andCityName:(NSString*)cityName
{
_kidGardenID = gardenID;
_gardenName.text = gardenName;
_kidCity.text = cityName;
}
修改
ViewController B didSelectRowAtIndexPath: code
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
NSArray *temp = [_responseDict valueForKey:@"ID"];
NSArray *temp1 = [_responseDict valueForKey:@"name"];
_kidGaedenID = [temp objectAtIndex:indexPath.row];
_kidGardenName = [temp1 objectAtIndex:indexPath.row];
[[self delegate] addItemViewController:self didFinishWithGardenID:_kidGaedenID gardenName:_kidGardenName andCityName:_kidCityName];
[self mz_dismissFormSheetControllerAnimated:YES completionHandler:^(MZFormSheetController *formSheetController) {
//dismiss the popup view which i create it VC A with that gitHub package:
https://github.com/m1entus/MZFormSheetController/issues/98
}];
编辑2 显示ViewControllerB的代码:
- (IBAction)chooseGardenAndCityBtn:(id)sender {
UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"modal"];
MZFormSheetController *formSheet = [[MZFormSheetController alloc] initWithViewController:vc];
formSheet.presentedFormSheetSize = CGSizeMake(300, 298);
// formSheet.transitionStyle = MZFormSheetTransitionStyleSlideFromTop;
formSheet.shadowRadius = 2.0;
formSheet.shadowOpacity = 0.3;
formSheet.shouldDismissOnBackgroundViewTap = YES;
formSheet.shouldCenterVertically = YES;
formSheet.movementWhenKeyboardAppears = MZFormSheetWhenKeyboardAppearsCenterVertically;
// formSheet.keyboardMovementStyle = MZFormSheetKeyboardMovementStyleMoveToTop;
// formSheet.keyboardMovementStyle = MZFormSheetKeyboardMovementStyleMoveToTopInset;
// formSheet.landscapeTopInset = 50;
// formSheet.portraitTopInset = 100;
__weak MZFormSheetController *weakFormSheet = formSheet;
// If you want to animate status bar use this code
formSheet.didTapOnBackgroundViewCompletionHandler = ^(CGPoint location) {
UINavigationController *navController = (UINavigationController *)weakFormSheet.presentedFSViewController;
if ([navController.topViewController isKindOfClass:[SearchCityTable class]]) {
SearchCityTable *mzvc = (SearchCityTable *)navController.topViewController;
mzvc.showStatusBar = NO;
}
[UIView animateWithDuration:0.3 animations:^{
if ([weakFormSheet respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[weakFormSheet setNeedsStatusBarAppearanceUpdate];
}
}];
};
formSheet.willPresentCompletionHandler = ^(UIViewController *presentedFSViewController) {
// Passing data
UINavigationController *navController = (UINavigationController *)presentedFSViewController;
navController.topViewController.title = @"בחר עיר";
};
formSheet.transitionStyle = MZFormSheetTransitionStyleCustom;
[MZFormSheetController sharedBackgroundWindow].formSheetBackgroundWindowDelegate = self;
[self mz_presentFormSheetController:formSheet animated:YES completionHandler:^(MZFormSheetController *formSheetController) {
}];
}
修改
答案 0 :(得分:4)
你在做什么
self.searchGarden = [[SearchGardenTable alloc]init];
但是你说你在故事板中有你的视图控制器。这让我认为view.DidLoad:中的self.searchGarden是与故事板中的对象不同的对象。
当您准备推送VC B时或在执行TheSegue之前(如果您使用segue),您应该将对象分配给self.searchGarden。
修改强>
从你的代码中我假设
UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"modal"];
是你的VC B,所以你需要做vc.delegate = self; 请记住,您的vc必须是VC B类型,在您的情况下是SearchGardenTable
编辑2
鉴于目前的设置,我现在想到的最快的解决方案是NSNotification。从您的VC B发送通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"userDidTapOnCell" object:nil userInfo:dictionaryOfObjects];
使用从模型中检索到的对象初始化对象词典,例如:
NSDictionary *dictionary = @{ @"gardenID": _kidGaedenID, @"gardenName": _kidGardenName };
在VC A中,您将自己添加为viewDidLoad上的通知的观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(gardenInfoDidComeBack:) name:@"userDidTapOnCell" object:nil];
并实施方法:
- (void)gardenInfoDidComeBack:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
// retrieve the kidGardenID and kidGardenName from the dict and use them as you whish.
}
希望这可以帮助您完成任务。可能你导航的架构并不是最好的,但这超出了本主题的范围,已经足够了。
答案 1 :(得分:2)
请显示您的VC B初始化。
确保在调用此行之前初始化self.searchGarden
self.searchGarden.delegate = self; // in VC A viewDidLoad.
答案 2 :(得分:0)
远射,但你试过了吗?
[[self delegate] addItemViewController:self didFinishWithGardenID:_kidGaedenID gardenName:_kidGardenName andCityName:_kidCityName]];
而不是
[self.delegate addItemViewController:self didFinishWithGardenID:_kidGaedenID gardenName:_kidGardenName andCityName:_kidCityName];
答案 3 :(得分:0)
我从您的疑问和关注中发现了什么
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
searchVC = (ControllerA *)[storyboard instantiateViewControllerWithIdentifier:@"controllerA"];
searchVC.delegate = self;
[self.navigationController pushViewController:searchVC animated:YES];
希望这会对你有所帮助:)。