在ViewControllerB和ViewControllerA之间传递数据,不会调用Delegate

时间:2014-07-28 09:54:32

标签: ios objective-c uiviewcontroller delegates

我尝试使用委托但没有成功,代理人没有被调用。 这是我的委托代码:

设置委托(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) {

    }];



}

修改 enter image description here

4 个答案:

答案 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];

希望这会对你有所帮助:)。