如何在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
超出其范围后,谁让您的element
或longPress
存活?我猜你忘了让你的对象活着......
对不起,我已经编辑了代码。
阅读 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中将孩子分配给父母?的主要内容,如果未能解决你的问题,请参考以下文章