将我自己的事件添加到Interface Builder菜单中的“已发送事件”,以用于我自己的自定义UIView

时间:2011-04-25 20:50:05

标签: objective-c cocoa-touch uiview uibutton

我已经创建了UIView的子类,我想让它发布在Interface Builder(实际上是Xcode4)中显示的自定义事件,就像UIButton这样的控件在“已发送事件”区域中有一堆事件一样右键单击Xco​​de 4设计器中的控件。我知道我可以使用委托(通过协议)或通知(通过U​​INotificationCenter)让对象使用我的自定义视图知道何时发生某些事情,但我想知道“目标 - 行动机制”(描述于可可基础指南(Cocoa Fundamentals Guide)适合/期望/可能使用并与Xcode设计器集成。这个方法主要来自.NET背景,似乎与.NET事件模型密切相关,对我来说最有意义。

3 个答案:

答案 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中进行绑定)。