Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:将数据从ChildViewController传递到祖父母ViewController?_Ios_Objective C_Iphone_Ios7 - Fatal编程技术网

iOS:将数据从ChildViewController传递到祖父母ViewController?

iOS:将数据从ChildViewController传递到祖父母ViewController?,ios,objective-c,iphone,ios7,Ios,Objective C,Iphone,Ios7,在两个视图控制器之间传递数据似乎已经用委托解决了。我的情况有点不同,因为我是新来的,我不知道我是否能和代表们一起解决这个问题 我有3个视图控制器祖父母,父母和孩子 祖父母实例化显示类别组列表的父母 单击一个CategoryGroup实例化Child查看显示类别列表的控制器 我希望当用户单击任何类别时,祖父母能够了解所单击的类别 我现在有什么 在Child.h视图控制器上 @protocol CategorySelectDelegate<NSObject> - (void) categ

在两个视图控制器之间传递数据似乎已经用委托解决了。我的情况有点不同,因为我是新来的,我不知道我是否能和代表们一起解决这个问题

我有3个视图控制器<代码>祖父母,
父母
孩子

祖父母
实例化显示
类别组列表的
父母
单击一个
CategoryGroup
实例化
Child
查看显示
类别列表的控制器

我希望当用户单击任何
类别
时,
祖父母
能够了解所单击的
类别

我现在有什么

Child.h
视图控制器上

@protocol CategorySelectDelegate<NSObject>
- (void) categorySelected:(CategoryModel *) categoryModel;
@end
祖父母.h

@interface GrandParent : UIViewController<CategorySelectDelegate>  
但是我知道这是不正确的,因为
祖父母
不是直接实例化
孩子
的人,总是生孩子的父母

问题
-如何将
类别模型
孩子
传递到
祖父母

-通常,如何将数据从一个子控制器传递回任何祖先控制器

更新

目前,我已经添加了2名代表来解决此问题
a、 )1名从
子级
父级

b、 )1名从
父母
祖父母


这是可行的,但我认为这不是一个好的设计,因为数据需要在两个或多个视图控制器之间传递,因为最终会创建新的委托来传递值。

您有一个有趣的问题

您可以建立一组可由任何对象订阅的全局协议,并向接收消息的对象传递。这就像构建一个单独的.h一样简单

因此,在父级构建子级时,父级必须在显示该子级视图控制器之前设置祖父母.delegate=child


当然,当子代被删除,父代再次显示时,需要将代理设置回原位。

如果要使用代理,则只能将祖父母作为代理传播给子代,以便在选择类别时可以向祖父母发送回调


或者,当选择类别时,您可以发布来自孩子的通知,并添加祖父母作为观察者以获取通知。

我有或多或少相同的用例,我更喜欢使用通知,因为它似乎是松散耦合的对象

让委托仅仅用于交换数据不是一个好的选择

请参考以下内容:

通知会导致对象之间的松散耦合。耦合是松散的,因为发送通知的对象不知道什么在侦听通知。T他的松耦合功能非常强大,因为多个对象都可以注册来侦听同一个通知 因此,如果其他视图控制器或任何其他小部件想要处理数据,那么不需要再设置一个委托就可以轻松实现

但这条线也适用


通知和委托提供如此不同的耦合这一事实表明,它们应该在不同的场景中使用。如果表视图使用通知而不是委托,那么所有使用表视图的类都可以为每个通知选择不同的方法名称。这将使您很难理解代码,因为您需要查找通知注册以确定调用哪个方法。对于委托,很明显:所有使用表视图的类都被强制以相同的方式构造。

我使用委托在vcs之间传递此类数据。但我也使用CoreData或NSUser在风投之间共享一些其他数据。
@interface GrandParent : UIViewController<CategorySelectDelegate>  
- (void)viewDidLoad {
    [super viewDidLoad];
    ChildViewController *categoryViewController = [[ChildViewController alloc] init];
    childViewController.delegate = self;
}

- (void)categorySelected:(CategoryModel *)categoryModel {
    _categoryLabel.text = categoryModel.name;
    NSLog(@"categoryLabel:%@", _categoryLabel.text);
}