如何确定UIView是否具有符合协议的委托

时间:2010-02-08 07:02:31

标签: iphone objective-c delegates protocols hittest

我编写了一个自定义类,它在很大程度上依赖于触摸拖动/定位,在它自己的视图边界之外。 存在使用各种相关方法定义的关联协议。 使用此协议的一个示例是一个允许从我的自定义类中删除内容的视图。

我遇到的问题是弄清楚触摸何时结束(对象被'掉落'),是否有一个物体在该位置下方。 (对于'关心',请阅读'符合协议'!)。

如果它是一个符合我的协议的视图,那么很简单,我可以使用- (CALayer *)hitTest:(CGPoint)thePoint或其他内容找到它并使用conformsToProtocol:@protocol(xx)进行查询。

但是如果它是一个视图,它是UIViewController的子视图(例如),则视图不符合协议,即使UIViewController(如它的委托)也是如此。 如果视图确实想要收到通知,我需要能够确定它的委托是谁,要发送消息。

因此,基本上,我如何从最低的UIView遍历视图层次结构,询问每个视图是否符合我的协议;如果没有,它是否有代表,并且符合......?

还是有一种我没想到的更简单的方法吗?

非常感谢..


解决

感谢moshy,我有一个解决方案:

- (UIView *)viewThatConformsToProtocol:(Protocol *)protocol AtPointInWindow:(CGPoint)point {
   UIView *lowestUIView = [[(AppDelegate).navigationController view] hitTest:point withEvent:nil];
   UIResponder *respondsToProtocol = lowestUIView;
   while ((respondsToProtocol != nil) && (![respondsToProtocol conformsToProtocol:protocol])) {
      respondsToProtocol = [respondsToProtocol nextResponder]; // else try the next responder up the chain
   };
   return (UIView *)respondsToProtocol;
}

这会返回视图,如果没有任何符合,则为nil

再次感谢..

1 个答案:

答案 0 :(得分:0)

好吧,一旦你拥有最低的视图,你就可以使用- (UIResponder *)nextResponder走上响应者链。

来自文档:

  

UIResponder类不存储   或设置下一个响应者   自动,而不是返回零   默认情况下。子类必须覆盖   此方法设置下一个响应者。   UIView通过实现此方法   返回UIViewController对象   它管理它(如果它有一个)或它   超级视图(如果没有);   UIViewController实现了该方法   通过返回其视图的超级视图;   UIWindow返回应用程序   对象,UIApplication返回nil。