如何在Objective-C中将孩子分配给父母?

Posted

技术标签:

【中文标题】如何在Objective-C中将孩子分配给父母?【英文标题】:How to assign child-to-parent in Objective-C? 【发布时间】:2014-10-28 12:07:30 【问题描述】:

我创建了一个继承 UIView 类的 UIElement 类,以便为我的视图创建自定义属性。

我遇到的问题,正如您所看到的代码,我无法将 UIElement 对象分配给 Gesture Recognizer 的 view 属性。

只要 UIElement 是 UIView 的子元素,我就不能建立子父关系。

我正在考虑(很多)想出一个解决方案,但我没有找到任何解决方案。

- (void)viewDidLoad 
    [super viewDidLoad];

    UIElement * element = [[UIElement alloc] init];
    element.name = @"A Name"; // Custom property


    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(responsToGesture:)];
longPress.minimumPressDuration = 0.3;
    [longPress setDelegate:self];
    [element addGestureRecognizer:longPress];



- (void)responsToGesture:(UILongPressGestureRecognizer *)sender 

    UIElement * element = sender.view; // Here's the problem: Incompatible pointer types
    NSLog(@"Element's Name: %@", element.name);

【问题讨论】:

您必须将手势识别器添加到您的 uielement。 –viewDidLoad 超出其范围后,谁让您的elementlongPress 存活?我猜你忘了让你的对象活着...... 对不起,我已经编辑了代码。 阅读 C 中的“cast”。 好吧,我咬一口。什么是 UIElement?那是可可触摸课程吗?我在任何地方都找不到它。是第三方类吗?如果是这样,它是 UIView 的子类吗? Objective-C 没有多重继承,所以如果 UIElement 不是 UIView 的子类,就不能让它成为 UIView 的子类。 【参考方案1】:

您必须将您的sender 转换为UIelement

- (void)responsToGesture:(UILongPressGestureRecognizer *)sender 
    if ([sender.view isKindOfClass:[UIElement class]]) 
        UIElement * element = (UIElement *)sender.view;
    

【讨论】:

UILongPressGestureRecognizer * 将始终是参数。他需要将sender.view 转换为UIElement * 没错,我编辑了我的答案。谢谢@JefferyThomas【参考方案2】:

您没有将 UILongPressGestureRecognizer 添加到您的视图中,因此不会调用 responsToGesture:

【讨论】:

【参考方案3】:

如果view 不是UIElement *,我会断言。未能尽早发现缺陷。

- (void)responsToGesture:(UILongPressGestureRecognizer *)gestureRecognizer

    NSParameterAssert([gestureRecognizer.view isKindOfClass:[UIElement class]]);

    UIElement * element = (UIElement *)gestureRecognizer.view;
    NSLog(@"Element's Name: %@", element.name);

【讨论】:

断言当然应该是不必要的,但是当你不太清楚自己在做什么时是额外的保险(这里显然就是这种情况)。

以上是关于如何在Objective-C中将孩子分配给父母?的主要内容,如果未能解决你的问题,请参考以下文章

如何在可扩展的listview android中将孩子添加到特定的父母

触发孩子时如何更改父母的值?

显示隐形父母的孩子

如何在 VueJS 中将模板(插槽)从祖父组件传递给孙子?

在 React TS 中将道具传递给孩子时出错

如何在 recyclerview 适配器中将动态视图添加到 android 布局