2014-11-24 103 views
0

在两个视图控制器之间传递数据似乎已经使用委托来解决。我的情况有点不同,既然我是新人,我不知道我能否与代表解决。iOS:将数据从ChildViewController传递给GrandParentViewController?

我有3个视图控制器。 GrandParentParentChild
GrandParent实例化Parent显示列表CategoryGroups
点击CategoryGroup实例化Child视图控制器显示Categories的列表。

我希望当用户点击任何Category时,GrandParent会得知被点击的Category

我现在拥有什么?

Child.h视图控制器

@protocol CategorySelectDelegate<NSObject> 
- (void) categorySelected:(CategoryModel *) categoryModel; 
@end 

Child.m视图控制器

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"selected category:%@", _categories[(NSUInteger) indexPath.row]); 
    [self.delegate categorySelected:_categories[(NSUInteger) indexPath.row]]; 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

GrandParent.h

@interface GrandParent : UIViewController<CategorySelectDelegate> 

GrandParent.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    ChildViewController *categoryViewController = [[ChildViewController alloc] init]; 
    childViewController.delegate = self; 
} 

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

但我知道这是不正确,因为GrandParent的一个直接实例Child,它始终是父母谁生下Child

问题
- 如何通过categoryModelChildGrandParent
- 一般来说,我如何将数据从一个子控制器传递回任何祖先控制器?

UPDATE

现在,我已经添加了2名代表来解决这个问题
一)从ChildParent
b 1名代表。)1名代表从ParentGrandParent
这工作,但我不认为这是一个好的设计,数据需要在两个或更多的视图控制器之间传递,因为最终会创建新的代理来传递值。

+0

那么,我使用委托在vcs之间传递这种数据。但我也使用CoreData或NSUser在vcs之间共享一些其他数据。 – leonard 2014-11-24 03:44:37

回答

0

有趣的问题,你有。

您可以建立一套可以被任何对象认购的全球协议,并通过周围的人谁收到邮件。这可以作为建立一个单独的.h

那么容易,因为父母建立孩子,父母必须提出的是子视图控制器之前设置grandparent.delegate =小孩。

然后,当然当孩子被删除,父母再次显示,委托需要被设置回来。

0

如果您想使用委托,那么除了将GrandParent作为委托传播给Child,以便在选择类别时可以将回调发送到GrandParent。

或者,您可以发布NSNotification从子选择类别时,并添加GrandParent作为观察员来获取通知。

1

我或多或少相同的使用情况,以及我宁愿去与通知,因为它似乎是松耦合对象,

使代表只是为了交换数据​​不会是一个不错的选择。

请参考How Best to Use Delegates and Notifications它说,

通知结果中的对象之间的松耦合。耦合是松散的,因为发送通知的对象不知道什么在收听通知。 T 他的松耦合可以是非常强大的,因为多个对象都可以注册以听相同的通知 因此,在其他视图控制器或任何其他小部件想要处理数据的情况下,可以轻松实现,无需设置更多的代表。

但此行也保持良好

该通知和代表提供这样的不同的耦合是它们应该在不同的情形中使用的指示器的事实。如果表视图使用通知而不是委托,则所有使用表视图的类都可以为每个通知选择不同的方法名称。这会让你很难理解代码,因为你需要去查找通知注册来确定调用哪个方法。使用委托,显而易见的是:所有使用表视图的类都将以相同的方式强制执行。