繁体   English   中英

iOS:将数据从ChildViewController传递到GrandParentViewController?

[英]iOS: passing data from ChildViewController to GrandParentViewController?

在两个视图控制器之间传递数据似乎已经使用委托解决了。 我的情况几乎没有什么不同,而且由于我是新手,所以我不知道我是否可以通过代表解决这个问题。

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

我希望当用户单击任何CategoryGrandParent会知道所单击的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父母


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

UPDATE

现在,我添加了2位代表来解决此问题
a。)一位从ChildParent代表
b。) GrandParentParentGrandParent Parent代表
这行得通,但我认为这不是一个好的设计,因为数据需要在2个或更多视图控制器之间传递,因为最终将创建新的委托来传递值。

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

仅仅为了交换数据​​而委派代表不是一个好选择。

请参阅如何最好地使用代表和通知 ,其中指出:

通知导致对象之间的松散耦合。 耦合很松散,因为发送通知的对象不知道正在侦听通知的内容。 松散耦合的功能非常强大,因为可以注册多个对象来监听相同的通知。因此,如果其他某个视图控制器或任何其他小部件想要处理数据,则可以轻松实现,而无需设置另一个委托。

但是这条线也很好

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

您有有趣的问题。

您可以建立一组全局协议,任何对象都可以订阅该协议,并绕过谁接收消息。 这就像建立一个单独的.h一样容易

因此,在父级生成子级时,父级必须在显示该子级视图控制器之前设置grandparent.delegate = child。

然后,当然,当删除子级并再次显示父级时,需要重新设置委托。

如果要使用委托,则只能将GrandParent传播给Child作为委托,以便在选择类别时可以将回调发送给GrandParent。

另外,当选择类别时,您可以从子项发布NSNotification,并将GrandParent添加为观察者以获取通知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM