在Interface Builder中创建新事件

时间:2012-02-12 13:55:14

标签: objective-c xcode xcode4

我正在开发一个在Interface Builder中使用的新组件,它将UIPickerView子类化为创建一个类似于UIDatePicker的接口,但也包括秒。我希望使用我的组件的开发人员能够从库中拖动一个新的Object,将其配置为TimePickerView类,并从那里使用它。

这一点完美无缺,但现在我想实现标准UIDatePicker中可用的一些事件,特别是“Value Changed”事件。我不知道如何在不使用委托协议的情况下以这种方式声明事件。我也不确定如何让XCode知道对象上可用的事件。因此,我真的问了三个问题:

  1. 如何在UIDatePicker上声明事件,例如Value Changed事件?
  2. 如何从我的TimePickerView中触发事件?
  3. 如何让XCode知道此事件,以便开发人员可以轻松地将事件链接到控制器?
  4. 由于这似乎不容易做到,我怀疑这可能是有原因的;因此,我也很感激我的方法和论据的评论,为什么我应该创建一个委托协议来实现这一点。

1 个答案:

答案 0 :(得分:1)

在Objective C和cocoa框架中,没有什么比声明一个事件(就像你在C#中所做的那样),使用委托模式实现事件的相同行为(这是所有cocoa类处理的方式)事件),所以用这种方式实现具有委托模式的自定义事件,例如:

协议和自定义类接口声明:

@protocol myDelegate <NSObject>
-(void)valueChanged:(double) value;
@end

@interface UAKTestDelegate : UIPickerView

@property(weak) id<myDelegate> delegate;

@end

实施中的某个地方(触发事件):

//Example of firing the event ....
if([[self delegate] respondsToSelector:@selector(valueChanged:)]) {
    [[self delegate] valueChanged:1.0];
}

所以,答案的第一部分应该解决你帖子中的前两个问题(创建和触发自定义事件),但对第三个答案的回答只是 你不能< / em> ...

Xcode(在本例中为接口构建器)知道UIControl(或其子类)实现的事件,但是没有办法告诉它你自己的自定义事件。

所以我认为在您的情况下(如果可以的话)您可以直接子类化UIDatePicker,并在需要时最终覆盖valueChanged。