【问题标题】:iOS: passing data from ChildViewController to GrandParentViewController?iOS:将数据从 ChildViewController 传递到 GrandParentViewController?
【发布时间】:2014-11-24 03:18:07
【问题描述】:

在两个视图控制器之间传递数据似乎已经使用委托解决了。我的情况略有不同,由于我是新手,我不知道我是否可以与代表一起解决这个问题。

我有 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 的父母

问题
- 如何将categoryModelChild 传递到GrandParent
- 一般来说,如何将数据从一个子控制器传回任何祖先控制器?

更新

目前,我已添加 2 个代表来解决此问题
a.) 1 个代表,从 ChildParent
b.) 1 个代表,从 ParentGrandParent
这可行,但我认为这不是一个好的设计,因为数据需要在 2 个或更多视图控制器之间传递,因为最终会创建新的委托来传递值。

【问题讨论】:

  • 嗯,我用delegate在vcs之间传递这种数据。但我也使用 CoreData 或 NSUser 在 vcs 之间共享一些其他数据。

标签: ios objective-c iphone ios7


【解决方案1】:

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

仅仅为了交换数据​​而设置委托不是一个好的选择。

请参考How Best to Use Delegates and Notifications,上面写着,

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

但这条线也不错

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

【讨论】:

    【解决方案2】:

    你有一个有趣的问题。

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

    因此,当父级构建子级时,父级必须在呈现该子视图控制器之前设置 grandparent.delegate = child。

    当然,当子级被移除并再次显示父级时,代理需要重新设置。

    【讨论】:

      【解决方案3】:

      如果你想使用委托,那么没有办法,只能将 GrandParent 作为委托传播给 Child,以便在选择类别时它可以向 GrandParent 发送回调。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-05
        • 2022-01-10
        • 1970-01-01
        • 2016-05-01
        • 2013-09-12
        • 1970-01-01
        • 2014-07-17
        相关资源
        最近更新 更多