1

我已经编写了一个自定义类,该类在它自己的视图边界之外显着依赖于触摸拖动/定位。有一个用各种相关方法定义的相关协议。使用这个协议的一个例子是一个视图,它允许从我的自定义类中将东西放入其中。

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

如果它是一个符合我的协议的视图,那很容易,我可以使用- (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任何内容。

再次感谢..

4

1 回答 1

0

好吧,一旦您获得最低视图,您就可以使用- (UIResponder *)nextResponder.

从文档:

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

于 2010-02-08T08:30:57.237 回答