我已经创建了UIView的子类,我想让它发布在Interface Builder(实际上是Xcode4)中显示的自定义事件,就像UIButton这样的控件在“已发送事件”区域中有一堆事件一样右键单击Xcode 4设计器中的控件。我知道我可以使用委托(通过协议)或通知(通过UINotificationCenter)让对象使用我的自定义视图知道何时发生某些事情,但我想知道“目标 - 行动机制”(描述于可可基础指南(Cocoa Fundamentals Guide)适合/期望/可能使用并与Xcode设计器集成。这个方法主要来自.NET背景,似乎与.NET事件模型密切相关,对我来说最有意义。
答案 0 :(得分:5)
有UIControlEventApplicationReserved,它为您提供应用可以使用的一系列事件标识符。但是,我认为没有任何方法可以告诉Interface Builder有关应用程序定义的事件,因此您不会像在UIControl的标准事件中那样获得IB中事件的相同支持。相反,您必须在代码中为每个应用程序定义的事件指定目标和操作。 (如果我在这一点上弄错了,请有人纠正我。)这一点都不困难,但有点不同。
答案 1 :(得分:3)
执行此操作的一种简单方法是扩展UIControl
而不是UIView
这将允许您将目标添加到所有默认事件(与UIButton
等相同)。
注意:为了让我的自定义UIControl
处理事件而不是我在其上分层的控件,我必须确保在所有分层控件上设置userInteractionEnabled = NO
。
答案 2 :(得分:1)
您可以使用IBOutletCollection执行此操作。这种方法的优点是您可以在Interface Builder中链接对象。缺点是您无法直接链接到IBActions(如UIControl)。这是一个使用协议的干净实现:
ObserverProtocol.h
@protocol ObserverProtocol <NSObject>
- (void)observedObjectChanged:(id)sender;
@end
MyObject.h
@interface MyObject : NSObject
{
@private
IBOutletCollection(id<ObserverProtocol>) NSArray *observers;
}
- (void)objectChanged;
MyObject.m
@implementation MyObject
- (void)objectChanged
{
for (id<ObserverProtocol> observer in observers)
{
if ([observer respondsToSelector:@selector(observedObjectChanged:)])
{
[observer observedObjectChanged:self];
}
}
}
@end
然后你只需要在想要观察事件的类中实现ObserverProtocol(当然在Interface Builder中进行绑定)。