2

在 UINavigationController 这是子控制器

.h

@protocol childProtocol <NSObject>

-(void)childMethod:(NSArray*)params;

@end

@property (strong, nonatomic) id<childProtocol>childDelegate;

@property (weak, nonatomic) parentVC *pVC;

.m 

if([self.childDelegate respondsToSelector:@selector(childMethod:)]) {

    [self.childDelegate performSelector:@selector(childMethod:) withObject:self.arry];    

}

这是我的父控制器

.m

-(void)childMethod:(NSArray *)params {
    // some work 
}

...

 childVC *cVC = [[childVC alloc]init];
    cVC.pVC = self;

但是 childMethod: 没有被调用所以我在互联网上搜索并得到了这篇文章 UINavigationControllers: How to pass value to Higher (parent?) controller in stack?

我试图创建一个弱引用,但不知道如何让委托将数据从孩子传递给父母?

4

3 回答 3

4

尝试这个。检查附加的示例项目

父视图控制器.h

#import <UIKit/UIKit.h>

@interface ParentViewController : UIViewController

- (void)passData:(NSString *)strText;

@end

父视图控制器.m

- (IBAction)btnGoToSecondView:(id)sender {
    ChildViewController *secondVC = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
    secondVC.delegate = self;
    [self presentViewController:secondVC animated:YES completion:nil];

}

- (void)passData:(NSString *)strText {
    NSLog(@"Data Passed = %@",strText);
}

ChildViewController.h

#import <UIKit/UIKit.h>
#import "ParentViewController.h"

@class ParentViewController;

@interface ChildViewController : UIViewController

@property(nonatomic, assign) ParentViewController *delegate;

@end

ChildViewController.m

- (IBAction)btnPassDataBack:(id)sender {
    if([self.delegate respondsToSelector:@selector(passData:)]) {
        [self.delegate passData:@"Hello"];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

示例项目

于 2013-06-20T05:09:47.987 回答
2

这是子控制器.h

@protocol childProtocol <NSObject>
    -(void)childMethod:(NSArray*)params;

@end

@property (strong, nonatomic) id<childProtocol>childDelegate;

@property (weak, nonatomic) parentVC *pVC;

.m

if([self.childDelegate respondsToSelector:@selector(childMethod:)]) {

    [self.childDelegate performSelector:@selector(childMethod:) withObject:self.arry];    

}

这是我的父控制器.h

#import <UIKit/UIKit.h>
#import "ChildController.h"


@interface perentController : UIViewController < childProtocol >

.m

- (void)childMethod:(NSArray *)params {
        // some work 
}

编辑:

并且不要忘记childViewOBJ.childDelegate = self;在创建ChildViewController's对象时添加。诸如此类,

childVC *cVC = [[childVC alloc]init];
cVC.childDelegate = self;
cVC.pVC = self;
[self presentModalViewController:cVC animated:YES];

有关如何创建/使用协议的更多信息。

于 2013-06-20T04:28:58.793 回答
0

首先,您没有检查与您在协议声明中声明的选择器相同的选择器,因此它不会对此做出响应。childMethod:您在检查 childDelegate 是否响应选择器时声明了该方法,而选择器没有响应,myMethod:因此它不会进入 if 条件。

父视图控制器也缺少childMethod:其 .m 中方法的实现。在你的父视图控制器中实现它,否则它会因为找不到确切的选择器定义而崩溃。

由于您使用的是 a UINavigationController,因此在子视图控制器存在之前,父视图控制器不会丢失,因此该childDelegate属性不能很强大,除非您出于某种原因打算在子视图控制器中保留您的委托。

于 2013-06-20T04:35:29.103 回答