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